Thema: Delphi JPEG-Fehler #42?

Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#12

Re: JPEG-Fehler #42?

  Alt 27. Feb 2005, 21:35
Ok, du bekommst den Fehler #41 (unter Delphi 5) und ich weis jetzt was DU falsch gemacht hast.

Alle Stream Operationen verändern den Stream-Zeiger -> Stream.Position, auch .LoadFromStream(). Will man erneut auf die Daten im Stream zugreifen so MUSS man vorher die .Position wieder auf den Anfang der Daten zurücksetzen. Sorry, aber ein oft gemachter Anfängerfehler.

Kurz gesagt: die Operationen der Streams in der VCL können die .Position innerhalb des Streams verändern sie dürfen sie aber niemals automatisch wieder auf 0 zurücksetzen. Das muß der Programmierer machen, logisch da ansonsten zb. in einem Stream nicht mehrere Bilder gespeichert werden könnten.

In deinem Falle

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  M: TMemoryStream;
  I: TJpegImage;
begin
  M := TMemoryStream.Create;
  I := TJpegImage.Create;
  try
    M.LoadFromFile(ExtractFilePath(ParamStr(0)) + '303649.jpg');

    M.Position := 0; // <--- so ist es richtig
// M.Position := M.Size; // <--- so ist es bei dir und Fehler #41 kommt
    I.LoadFromStream(M);

    Image1.Picture.Assign(I);
  finally
    M.Free;
    I.Free;
  end;
end;
Dein JPEG ist also absolut in Ordnung. Im obigen Beispiel wird .LoadFromFile() benutzt, und diese Funktion setzt sehr wohl M.Position auf 0 zurück. Das ist auch in diesem Falle logisch. Das Beispiel dient also nur als Demonstation wenn du zb. statt .LoadFromFile() .LoadFromStream() benuzten würdest.

Gruß Hagen
  Mit Zitat antworten Zitat