AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TJpegImage saveToStream und saveTo File funktioniert nicht

TJpegImage saveToStream und saveTo File funktioniert nicht

Ein Thema von night · begonnen am 29. Aug 2009 · letzter Beitrag vom 16. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2   
night

Registriert seit: 23. Jun 2006
22 Beiträge
 
Turbo Delphi für Win32
 
#1

TJpegImage saveToStream und saveTo File funktioniert nicht

  Alt 29. Aug 2009, 20:36
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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 31. Aug 2009, 12:04
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:
  if n >= 0 then begin Ansonsten Schritt für Schritt fortsetzen und dabei jedesmal den Inhalt aller beteiligten Variablen überprüfen.
  Mit Zitat antworten Zitat
night

Registriert seit: 23. Jun 2006
22 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 31. Aug 2009, 16:50
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.
len := ms.Size; ist aber 0. KA warum....

Viele Grüße
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.752 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 31. Aug 2009, 17:00
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
Klaus
  Mit Zitat antworten Zitat
night

Registriert seit: 23. Jun 2006
22 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 1. Sep 2009, 02:57
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 1. Sep 2009, 03:21
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.
fork me on Github
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 1. Sep 2009, 09:19
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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.752 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 1. Sep 2009, 09:48
Guten Morgen,

bist Du dir sicher, dass kein File angelegt wurde.

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

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
night

Registriert seit: 23. Jun 2006
22 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 1. Sep 2009, 16:49
Zitat von Blup:
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 von Klaus01:
Guten Morgen,

bist Du dir sicher, dass kein File angelegt wurde.

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 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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: TJpegImage saveToStream und saveTo File funktioniert nic

  Alt 2. Sep 2009, 08:15
Zitat von night:
Zitat von Blup:
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.
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