![]() |
TJpegImage saveToStream und saveTo File funktioniert nicht
Hallo,
ich habe ein Programm, dass ein JPG öffnent. Dann möchte ich dazu ein Text schreiben. Der Text, das Bild und das Datum sollen in eine neue Datei geschrieben werden. Wenn ich nur den Text und das Datum abspeichere, dann funktioniert das ohne Probleme. Sobald ich aber das Bild mit abspeichern möchte, kommt kein Fehler, aber es wird auch keine Datei erzeugt. Ich habe dann versucht, dass Bild direkt wieder mit SaveToFile in eine Datei zu schreiben, aber dabei wird auch keine Datei erstellt. Mein Code zum Laden des Bildes:
Delphi-Quellcode:
Das Bild wird auf dem Image (IPicture) angezeigt.
if form1.OpenPictureDialog1.execute then begin
Data := self.data(form1.MCalendar.Date); Data.FPicture.Free; Data.FPicture := TJpegImage.Create; Data.FPicture.CompressionQuality := 20; Data.FPicture.LoadFromFile(form1.OpenPictureDialog1.FileName); form1.IPicture.Picture.Bitmap.Assign(Data.FPicture); end; So nun die Methode zum Speichern des Textes:
Delphi-Quellcode:
Data.FPicture ist nicht NIL und es kommt auch kein Fehler beim Ausführen von SaveToFile, aber die Datei wird nicht erzeugt.
procedure TAdmin.save;
var stream:TFileStream; i,n:Integer; begin n :=-1; n := high(FData); if n >= 0 then begin stream := TFileStream.Create(InitialFile, fmCreate); try try stream.Write(n, sizeOf(n)); for I := 0 to n do FData[i].save(stream); except on e: exception do showmessage(e.Message); end; finally FreeAndNil(stream); end; end; end; Data := self.data(form1.MCalendar.Date); Data.FText := form1.MMessageInput.Text; if Data.FPicture <> nil then Data.FPicture.SaveToFile('test.jpg'); // Einfach nur zum Testen So und nun mein Code zum Speichern
Delphi-Quellcode:
und die Methode TData.save(s:Stream)
procedure TAdmin.save;
var stream:TFileStream; i,n:Integer; begin n :=-1; n := high(FData); if n >= 0 then begin stream := TFileStream.Create(InitialFile, fmCreate); try try stream.Write(n, sizeOf(n)); for I := 0 to n do FData[i].save(stream); except on e: exception do showmessage(e.Message); end; finally FreeAndNil(stream); end; end; end;
Delphi-Quellcode:
Das Abspeichern des Bildes habe ich von
procedure TData.save(stream: TFileStream);
var ms: TMemoryStream; len: Int64; strlen: Integer; begin if stream <> nil then begin stream.Write(FDate, sizeOf(FDate)); strlen := length(FText); stream.Write(strlen, sizeof(strlen)); stream.Write(FText[1], strlen); ms := TMemoryStream.Create; try try FPicture.SaveToStream(ms); len := ms.Size; stream.Write(len, sizeOf(len)); ms.SaveToStream(stream); except on e: exception do showmessage(e.Message); end; finally FreeAndNil(ms); end; end; end; ![]() Vielen Dank und Viele Grüße Stefan |
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Bei deinem Code zum Laden des Bildes fehlt ja wohl einiges, insbesondere der Teil der FData betrifft.
Setz mal einen Breakpunkt und schau wie groß n ist:
Delphi-Quellcode:
Ansonsten Schritt für Schritt fortsetzen und dabei jedesmal den Inhalt aller beteiligten Variablen überprüfen.
if n >= 0 then begin
|
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Hi, um das Laden habe ich mich noch nicht gekümmert, da das abspeichern noch nicht geht.
FData hat, je nach dem wie viele Werte ich eingebe, zwischen 2 und 5 Arrayelemente und FData[i].FPicture hat auch eine Referenz. Das FData[i].FPicture wird ja auch auf das Image kopiert und angezeigt.
Delphi-Quellcode:
ist aber 0. KA warum....
len := ms.Size;
Viele Grüße |
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Vielleicht geht es so?
Delphi-Quellcode:
....
ms := TMemoryStream.Create; try try FPicture.SaveToStream(ms); len := ms.Size; //stream.Write(len, sizeOf(len)); ms.Position := 0; stream.Write(ms,len); // schreibe den MemoryStream in den FileStream //ms.SaveToStream(stream); except on e: exception do showmessage(e.Message); end; Alternativ sollte es auch so gehen:
Delphi-Quellcode:
Grüße
ms : TMemoryStream.create;
FPicture.SaveToStream(ms); ms.Position :=0; ms.SaveToFile(FileName); Klaus |
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Ich verstehe das nicht. Es geht nicht.
Ich habe dein Code jetzt mal direkt in die Load Methode gepack.
Delphi-Quellcode:
was auch sehr komisch ist, dass in len ein anderer Wert als in ms.size steht ....(nach len := ms.size;) :?
procedure TAdmin.loadPicture;
var Data: TData; ms: TMemoryStream; len:Int64; begin if form1.OpenPictureDialog1.execute then begin Data := self.data(form1.MCalendar.Date); Data.FPicture.Free; Data.FPicture := TJpegImage.Create; Data.FPicture.CompressionQuality := 20; Data.FPicture.LoadFromFile(form1.OpenPictureDialog1.FileName); //zum testen ms := TMemoryStream.Create; try try Data.FPicture.SaveToStream(ms); len := ms.Size; //stream.Write(len, sizeOf(len)); ms.Position := 0; ms.SaveToFile('test.jpg'); //stream.Write(ms,len); // schreibe den MemoryStream in den FileStream except on e: exception do showmessage(e.Message); // es wird keine Exception geworfen... end; // aber auch keine Datei erstellt. finally FreeAndNil(ms); end; form1.IPicture.Picture.Bitmap.Assign(Data.FPicture); // und hier wird das Bild richtig ins Image kopiert... // warum geht dann der Stream nicht? end; end; |
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Ich sehe da jede Menge
![]() Du greifst z.B. ständig auf die globale Variable form1 zu. Oder noch ein Beispiel:
Delphi-Quellcode:
Der Aufruf von form1.OpenPictureDialog1.execute ist doch von Hinten-durch-die-Brust-ins-Auge.
procedure TAdmin.loadPicture;
... begin if form1.OpenPictureDialog1.execute then begin Gib' der procedure loadPicture einen Übergabeparameter const filename:string und der Code wird deutlich besser. Wenn du diese Probleme beseitigst, dann wird auch dein ursprüngliches Problem leichter zu beheben. |
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Zitat:
Geladen und angezeigt wird Data, FData wird nur beim Speichern benutzt. Wenn FData[i].FPicture eine gültige Komponente ist, heist das noch lange nicht das auch Daten einer Grafik enthalten sind. |
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Guten Morgen,
bist Du dir sicher, dass kein File angelegt wurde.
Delphi-Quellcode:
Ohne jedwede Pfadangabe kannst Du dir nicht sicher sein wo das File abgelegt wird.
ms.SaveToFile('test.jpg');
Grüße Klaus |
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Zitat:
form1.IPicture.Picture.Bitmap.Assign(Data.FPicture ); und hier auf das Image kopiert. und es wir auch angezeigt. Zitat:
Zitat:
|
Re: TJpegImage saveToStream und saveTo File funktioniert nic
Zitat:
Bitte lesen, nicht nur zitieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz