Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TJpegImage saveToStream und saveTo File funktioniert nicht (https://www.delphipraxis.net/139485-tjpegimage-savetostream-und-saveto-file-funktioniert-nicht.html)

night 29. Aug 2009 19:36


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:
  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;
Das Bild wird auf dem Image (IPicture) angezeigt.

So nun die Methode zum Speichern des Textes:

Delphi-Quellcode:
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
Data.FPicture ist nicht NIL und es kommt auch kein Fehler beim Ausführen von SaveToFile, aber die Datei wird nicht erzeugt.

So und nun mein Code zum Speichern
Delphi-Quellcode:
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;
und die Methode TData.save(s:Stream)
Delphi-Quellcode:
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;
Das Abspeichern des Bildes habe ich von http://www.delphipraxis.net/internal....php?p=1030334.

Vielen Dank und Viele Grüße
Stefan

Blup 31. Aug 2009 11:04

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:
  if n >= 0 then begin
Ansonsten Schritt für Schritt fortsetzen und dabei jedesmal den Inhalt aller beteiligten Variablen überprüfen.

night 31. Aug 2009 15:50

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:
len := ms.Size;
ist aber 0. KA warum....

Viele Grüße

Klaus01 31. Aug 2009 16:00

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:
ms : TMemoryStream.create;
FPicture.SaveToStream(ms);
ms.Position :=0;
ms.SaveToFile(FileName);
Grüße
Klaus

night 1. Sep 2009 01:57

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:
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;
was auch sehr komisch ist, dass in len ein anderer Wert als in ms.size steht ....(nach len := ms.size;) :?

sx2008 1. Sep 2009 02:21

Re: TJpegImage saveToStream und saveTo File funktioniert nic
 
Ich sehe da jede Menge Code Smells in deinen Sourcecode Schnippseln.
Du greifst z.B. ständig auf die globale Variable form1 zu.

Oder noch ein Beispiel:
Delphi-Quellcode:
procedure TAdmin.loadPicture;
...
begin
  if form1.OpenPictureDialog1.execute then begin
Der Aufruf von form1.OpenPictureDialog1.execute ist doch von Hinten-durch-die-Brust-ins-Auge.
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.

Blup 1. Sep 2009 08:19

Re: TJpegImage saveToStream und saveTo File funktioniert nic
 
Zitat:

Zitat von night
Das FData[i].FPicture wird ja auch auf das Image kopiert und angezeigt.

Das geht aber aus deinen Code-Schnipseln nicht hervor.
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.

Klaus01 1. Sep 2009 08:48

Re: TJpegImage saveToStream und saveTo File funktioniert nic
 
Guten Morgen,

bist Du dir sicher, dass kein File angelegt wurde.

Delphi-Quellcode:
ms.SaveToFile('test.jpg');
Ohne jedwede Pfadangabe kannst Du dir nicht sicher sein wo das File abgelegt wird.

Grüße
Klaus

night 1. Sep 2009 15:49

Re: TJpegImage saveToStream und saveTo File funktioniert nic
 
Zitat:

Zitat von Blup
Zitat:

Zitat von night
Das FData[i].FPicture wird ja auch auf das Image kopiert und angezeigt.

Das geht aber aus deinen Code-Schnipseln nicht hervor.
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.

Data.FPicture.LoadFromFile(form1.OpenPictureDialog 1.FileName); Hier wird das Bild geladen.

form1.IPicture.Picture.Bitmap.Assign(Data.FPicture ); und hier auf das Image kopiert. und es wir auch angezeigt.



Zitat:

Zitat von Klaus01
Guten Morgen,

bist Du dir sicher, dass kein File angelegt wurde.

Delphi-Quellcode:
ms.SaveToFile('test.jpg');
Ohne jedwede Pfadangabe kannst Du dir nicht sicher sein wo das File abgelegt wird.

Grüße
Klaus

Okay ich teste es gleich mal mit dem ganzen Pfad.


Zitat:

Zitat von sx2008
Ich sehe da jede Menge Code Smells in deinen Sourcecode Schnippseln.
Du greifst z.B. ständig auf die globale Variable form1 zu.

Oder noch ein Beispiel:
Der Aufruf von form1.OpenPictureDialog1.execute ist doch von Hinten-durch-die-Brust-ins-Auge.
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.

Habe ich geändert und ich übergebe auch das Datum. Das Problem besteht aber weiterhin.

Blup 2. Sep 2009 07:15

Re: TJpegImage saveToStream und saveTo File funktioniert nic
 
Zitat:

Zitat von night
Zitat:

Zitat von Blup
Zitat:

Zitat von night
Das FData[i].FPicture wird ja auch auf das Image kopiert und angezeigt.

Das geht aber aus deinen Code-Schnipseln nicht hervor.
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.

Data.FPicture.LoadFromFile(form1.OpenPictureDialog 1.FileName); Hier wird das Bild geladen.

form1.IPicture.Picture.Bitmap.Assign(Data.FPicture ); und hier auf das Image kopiert. und es wir auch angezeigt.

Genau das hab ich doch geschrieben Data <> FData.
Bitte lesen, nicht nur zitieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:57 Uhr.
Seite 1 von 2  1 2      

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