Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TMemoryStream.ReadBuffer (https://www.delphipraxis.net/215552-tmemorystream-readbuffer.html)

dmitrienko 26. Jul 2024 10:46


TMemoryStream.ReadBuffer
 
Folgender Code funktioniert nicht richtig. Ich versuche eine JPG aus TImage in TMemoryStream zu speichern, um danach den Inhalt des TMemoryStreams in ein Feld vom Typ TBytes zu packen. Die JPG scheint im TMemoryStream intakt, aber nach dem einlesen in TBytes-Feld kommt nur Daten-Müll raus, das heißt anstelle der JPG kommt nur 0x00 raus. Wenn ich ReadBuffer benutze, dann kommt die Meldung "Stream Lesefehler". Wenn ich Read benutze, dann kommt keine Meldung, dafür aber wird in TBytes-Feld Müll reingeschrieben.

Dieses Problem tritt sowohl bei Delphi 11.3 Community Edition, als auch bei Delphi 12.1 Trial Edition auf. Hier ist der Link zu dem Code:
Delphi-Quellcode:
var
  a_FileName: String;
begin
  if (Assigned(ImageOfTheDay.Picture.Graphic)) then
  begin
    ImageOfTheDay.Picture.SaveToStream(fMemoryStream);
    a_FileName := ExtractFilePath(fFileName) + 'test0.jpg';
    fMemoryStream.SaveToFile(a_FileName); // die jpg, die rauskommt, ist intakt
    SetLength(fBytes, fMemoryStream.Size);
    if (Length(fBytes) > 0) then
      fMemoryStream.Read(fBytes[0], Length(fBytes)); // hier wird Müll ins TBytes-Feld reingeschrieben
      // fMemoryStream.ReadBuffer(fBytes[0], Length(fBytes));
      // bei readbuffer trit stream lesefehler auf, bei einfachem read kommt kein fehler auf
    fMemorystream.Clear;
    if (Length(fBytes) > 0) then
    begin
      fMemoryStream.WriteBuffer(fBytes, Length(fBytes));
      a_FileName := ExtractFilePath(fFileName) + 'test1.jpg'; // die jpg, die rauskommt, ist kaputt
      fMemoryStream.SaveToFile(a_FileName);
      fMemorystream.Clear;
    end;
  end;
end;

Gausi 26. Jul 2024 10:52

AW: TMemoryStream.ReadBuffer
 
Hallo und willkommen in der Delphi-Praxis!

Was liefert denn
Delphi-Quellcode:
fMemoryStream.Read(fBytes[0], Length(fBytes));
zurück, d.h. wie viele Bytes werden tatsächlich gelesen?

Funktioniert es, wenn du die Position im Stream vor dem Lesen auf 0 zurücksetzt?
Delphi-Quellcode:
fMemoryStream.Position := 0

DeddyH 26. Jul 2024 11:01

AW: TMemoryStream.ReadBuffer
 
Das "Zurückspulen" des Streams ist tatsächlich nötig, gerade ausprobiert.

@TE: Herzlich Willkommen in der DP. Bitte benutz künftig für Delphi-Code auch die Delphi-Tags, entweder über die "Helm"-Schaltfläche im Beitragseditor oder indem Du den Code in [ delphi ] und [ /delphi ] (ohne die Leerzeichen) einschließt.

himitsu 26. Jul 2024 11:31

AW: TMemoryStream.ReadBuffer
 
Zitat:

Zitat von dmitrienko (Beitrag 1539264)
// hier wird Müll ins TBytes-Feld reingeschrieben

Oder wohl eher "nichts"

Zitat:

Zitat von dmitrienko (Beitrag 1539264)
// bei readbuffer trit stream lesefehler auf, bei einfachem read kommt kein fehler auf

Ja, das war aber auch richtig, da eben nichts, bzw. nicht genug gelesen werden konnte.
Beim Read mußt du die Rückgabe (Result) prüfen
und das ReadBuffer prüft es selbst (wirft bei Fehler eine Exception).

Und wo kommt das fMemoryStream überhaupt her?
Nicht dass da vorher schon was drin liegt und der Pointer ebenfalls sonstwo steht.

Also eventuell auch noch ein
Delphi-Quellcode:
fMemoryStream.Clear;
vor dem
Delphi-Quellcode:
Picture.SaveToStream(fMemoryStream)
.


Warum ist das fMemorystream überhaupt eine globale Variable, wenn es doch "eigentlich" (am Ende ein Clear) nur lokal genutzt wird?

dmitrienko 26. Jul 2024 11:44

AW: TMemoryStream.ReadBuffer
 
FMemoryStream.Read liefert die Größe der JPG, das in fBytes reingeschrieben wurde.

Das mit
Delphi-Quellcode:
fMemoryStream.Position := 0
vor
Delphi-Quellcode:
fMemoryStream.ReadBuffer
war die Lösung.

Also vielen Dank, Leute! Es funzt!

dmitrienko 26. Jul 2024 11:45

AW: TMemoryStream.ReadBuffer
 
Habe
Delphi-Quellcode:
fMemoryStream
auf lokale
Delphi-Quellcode:
a_MemoryStream
umgestellt.

Danke für den Hinweis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz