Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Image.Picture als JPEG Speichern???? (https://www.delphipraxis.net/110613-image-picture-als-jpeg-speichern.html)

SimStar001 20. Mär 2008 19:07


Image.Picture als JPEG Speichern????
 
Hallo, ich habe ein Problem mit folgendem Code:


Delphi-Quellcode:

var bild : TJPEGImage;
...

bild.assign(Image1.picture.bitmap);
bild.savetofile('blalbabla.jpeg');

das problem ist nu, dass ich nen bild von 6000 * 4000 pixeln habe und der Speichervorgang sehr lange dauert, und er das bild als bmp speichert, welches dann 115 MB groß ist!


wenn ich das über paint zur richtigen jpeg umwandel, dann ist es nur noch 600kb groß!


wie kann ich das bild nun in delphi direct gleich als jpeg speichern??



hat jemand ne idee?



Vielen Dank

Klaus01 20. Mär 2008 19:11

Re: Image.Picture als JPEG Speichern????
 
Guten Abend,

schau Dir mal den Code von Delphi about.com an.

Grüße
Klaus

Fussball-Robby 20. Mär 2008 19:16

Re: Image.Picture als JPEG Speichern????
 
Zitat:

Zitat von SimStar001
und er das bild als bmp speichert, welches dann 115 MB groß ist!

Was heißt, er speichert es als bmp? Heißt es dann bild.bmp? Oder woran erkennst du das?

SimStar001 20. Mär 2008 19:18

Re: Image.Picture als JPEG Speichern????
 
nein die endung der datei ist jpeg aber halt 115 mb groß

wenn ichs dann in paint öffne und dort speihern unter auswähle zeigt er mir bmp an!

speichere ichs dann als jpeg ist es wie gesagt nur noch noch 600kb groß!


das versteh ich net!

Fussball-Robby 20. Mär 2008 19:21

Re: Image.Picture als JPEG Speichern????
 
Dann zeit mal den ganzen Code, mit dem du speicherst. Vielleicht hat sich da irgendwo ein fehler eingeschlichen.

SimStar001 20. Mär 2008 19:25

Re: Image.Picture als JPEG Speichern????
 
im moment habe ich diesen code, davor hatte ich den anderen wie oben angegeben



Delphi-Quellcode:
form16.Rechnung.picture.bitmap.SaveToFile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Test_Seite1.jpeg');

Fussball-Robby 20. Mär 2008 19:35

Re: Image.Picture als JPEG Speichern????
 
Es ist klar, dass es so nicht funktioniert, da das Bild nicht konvertiert wird. Probiers mal damit:
Delphi-Quellcode:
Function SaveBitmapAsJPEG(BMP:TBitmap;Filename:String):Boolean;
Var Bild:TJPEGImage;
Begin
  Result:=false;
  Bild:=TJPEGImage.Create;
  Try
    Bild.Assign(BMP);
    Bild.SaveToFile(filename);
  Finally
    FreeAndNil(Bild);
    Result:=true;
  End;
End;

//////Beispielaufruf:
if SaveBitmapAsJPEG(form16.Rechnung.picture.bitmap,extractfilepath(paramstr(0)) + 'Daten\Rechnungen\Test_Seite1.jpg') Then ShowMessage('Juhu :-)');
Mfg

SimStar001 20. Mär 2008 19:39

Re: Image.Picture als JPEG Speichern????
 
also kann ich jetzt für die Bitmap das Image.picture nehmen und gebe dann als Daeiname für die JPEG einfach .....jpeg ein? und dann funktioniert das?

Fussball-Robby 20. Mär 2008 19:40

Re: Image.Picture als JPEG Speichern????
 
Ich hab dir doch den Aufruf direkt dahingeschrieben

SimStar001 20. Mär 2008 19:42

Re: Image.Picture als JPEG Speichern????
 
aja jetzt hab ichs, gut ich werds dann mal ausprobieren!


Danke für die Hilfe!

SimStar001 20. Mär 2008 19:47

Re: Image.Picture als JPEG Speichern????
 
also jetzt kommt ne fehler meldung, dass net genug Speicher vorhanden ist!



keine ahnung was nu los ist!

Fussball-Robby 20. Mär 2008 19:50

Re: Image.Picture als JPEG Speichern????
 
Zeig mal den Code

Die Muhkuh 20. Mär 2008 19:51

Re: Image.Picture als JPEG Speichern????
 
Festplattenspeicher oder RAM?

SimStar001 20. Mär 2008 19:52

Re: Image.Picture als JPEG Speichern????
 
Fehlermeldung


EOutOfResources Für diesen Befehl ist nicht genug Speicher vorhanden!

hier ist der Code

Delphi-Quellcode:
Bild:=TJPEGImage.Create;
          Try
          Bild.Assign(form16.Rechnung.picture.bitmap);
          Bild.SaveToFile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Test.jpeg');
          finally
          showmessage('fertig');
          end;

turboPASCAL 21. Mär 2008 05:30

Re: Image.Picture als JPEG Speichern????
 
1. Wieviel RAM hast du ?
2. Du hast im finally - Teil Bild.Free vergessen.

Wenn du Resourcen nicht wieder frei gibst können solche Fehler/Warnungen entstehen.

Ich würde es so machen:


Delphi-Quellcode:
procedure ...
var
  JpegBild: TJPEGImage;
begin
  //...

  with Form16.Rechnung.Picture do
  begin
    if Assigned(Bitmap) then
    begin
      JpegBild := TJPEGImage.Create;
      try
        JpegBild.Assign(Bitmap);
        JpegBild.CompressionQuality := 75; // 1 schlechte bis 100 gute JPEG.Qualit.
        JpegBild.Compress;
        JpegBild.SaveToFile(ExtractFilePath(ParamStr(0)) + '\Daten\Rechnungen\Test.jpeg');
      finally
        JpegBild.Free; // <--<<
      end;
      ShowMessage('Fertig.');
    end else
    begin
      ShowMessage('Fehler: Kein Bitmap in Image.');
    end;
  end;

  //...

SimStar001 21. Mär 2008 09:36

Re: Image.Picture als JPEG Speichern????
 
Ok vielen dank, ich werde das gleich mal ausprobieren!

SimStar001 22. Mär 2008 16:40

Re: Image.Picture als JPEG Speichern????
 
klappt leider immernoch net!????????????????????????


was nun!? :?: :?: :?: :?:

dajuhsa 22. Mär 2008 16:46

Re: Image.Picture als JPEG Speichern????
 
immernoch der gleiche fehler? zeig mal neuen code :-)

SimStar001 22. Mär 2008 16:58

Re: Image.Picture als JPEG Speichern????
 
ich versteh net warum, wenn ich wie jetzt bei meinem code das bild vorher speichere, dann geht das wunderbar, aber dauert ewig!


hier ist der jetztige code:
Delphi-Quellcode:

// Seite Speichern zum drucken
              Rechnung.Picture.Graphic.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');
              Bild := TJPEGIMAGE.create;
              Bild.Assign(Rechnung.Picture.Bitmap);
              Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
              bild.Free;
              deletefile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');

und ich will genau das speichern der bmp auf festplatte umgehen, nur zeigt er mir wenn ichs wie weiter vorn beschrieben mache immer den fehler mit dem speicher an!

dajuhsa 22. Mär 2008 17:09

Re: Image.Picture als JPEG Speichern????
 
1.warum speicherst du es erst als bmp und löschst es danach gleich wieder?
2.außerdem solltest du assign und savetofile in einen try-block setzen und das free in einen finally-block, wenn jetzt im try-block etwas schiefgeht, wird der finally-block ausgefürt und das objekt zerstört, damit kein speicherloch entsteht.
3.Außerdem solltest du Compress anwenden, sonst wird der Speicherplatzverbrauch nicht sonderlich reduziert (=> dauert lange).
4.Vielleicht ist ja auch deine Festplatte voll(was von deinem riesigen Bitmap kommen kann :mrgreen: ,siehe dazu auch #1), ansonsten kann ich dir leider nicht helfen

DeddyH 22. Mär 2008 17:16

Re: Image.Picture als JPEG Speichern????
 
Hast Du denn wenigstens mal einen Breakpoint gesetzt und durchgesteppt, um die betroffene Zeile auszumachen? Dass das am vorherigen Speichern liegen soll, kann ich irgendwie nicht glauben.

[edit] Schlechtschreibung [/edit]

SimStar001 22. Mär 2008 17:18

Re: Image.Picture als JPEG Speichern????
 
also den code hier habe ich wie gesagt jetzt, da der funktioniert!

ich hatte zuvor auch alles so gemacht wie gesagt aber dann kam halt der fehler. die festplatte ist frei, da habsch genug speicher!

das bild speichere ich hier erst, weil ich es dann komischerweise laden und umwandeln kann und dann keine fehlermeldung kommt, gehe ich den direkten weg und mache es so, kommt immer die speichermeldung, was ich net versteh:

Delphi-Quellcode:
              Bild := TJPEGIMAGE.create;
              Bild.Assign(Rechnung.Picture.Bitmap);
bild.CompressionQuality := 75;
Bild.compress;
              Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
              bild.Free;

geht net in meinen kopf rein!

SimStar001 22. Mär 2008 17:19

Re: Image.Picture als JPEG Speichern????
 
ja habsch, es kommt immer in der ZEILE


Delphi-Quellcode:
Bild.compress;
oder halt wenn ich dass Compressieren weglasse bei:

Delphi-Quellcode:
savetofile(....);

dajuhsa 22. Mär 2008 17:36

Re: Image.Picture als JPEG Speichern????
 
ist in
Delphi-Quellcode:
rechnung.picture.bitmap
denn überhaupt ein bild geladen, also assigned?
schreib mal vor deinen speichern-aufruf
Delphi-Quellcode:
if not Assigned(rechnung.picture.bitmap) then
begin
showmessage('MIEEEP!Bild nicht Assigned!');
exit
end;

Namenloser 22. Mär 2008 17:49

Re: Image.Picture als JPEG Speichern????
 
Hast du es mal testweise mit einem kleineren Bitmap versucht? Vielleicht reicht dein Speicher ja wirklich nicht aus.

DeddyH 22. Mär 2008 18:52

Re: Image.Picture als JPEG Speichern????
 
Aber dass mehr Speicher zur Verfügung stehen soll, wenn man die Bitmap vorher auf der HD ablegt, erscheint mir etwas abstrus.

Namenloser 22. Mär 2008 20:01

Re: Image.Picture als JPEG Speichern????
 
Naja, wenn er es als Bitmap speichert landet die direkt auf der Platte, während das JPEG erstmal in den Arbeitsspeicher kommt und das Bitmap komprimiert. Ich weiß nicht, wie viel speicher das ganze benötigt, aber mal mindestens das Doppelte denke ich schon, weil die Daten ja zweimal im Speicher stehen müssen. Wenn das Bitmap c.a. 150mb groß ist, wären das 300mb, also schon recht viel für ein einzelnes Programm.

[edit]ich sollte genauer lesen... sry[/edit]

Schwedenbitter 22. Aug 2008 22:30

Re: Image.Picture als JPEG Speichern????
 
Kann mir bitte auch mal jemand helfen. Ich wollte kein neues Thema aufmachen, weil es hier gut her passt und bestimmt jemand eine Antwort parat hat. Ich habe folgendes geschrieben. In Image1 ist ein Bild drin (sichtbar). Aber meine jpg-Datei ist immer leer (0 Bytes).

Was ist bei mir falsch?

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
Var
   Jpg :TJPEGImage;
begin
   If Not Assigned(Image1.Picture.Graphic) Then
      MessageDlg('Kein Bild im Speicher',mtWarning,[mbOK],0)
   Else
   Begin
      SaveDialog1.Execute;
      If SaveDialog1.FileName='' Then
         MessageDlg('Keine Datei ausgewählt',mtWarning,[mbOK],0)
      Else
      Begin
         If ExtractFileExt(SaveDialog1.FileName)<>'.jpg' then
            SaveDialog1.FileName:=SaveDialog1.FileName+'.jpg';
         Jpg:=TJPEGImage.Create;
         Jpg.Assign(Image1.Picture.Graphic);         // Bild zuweisen
         Jpg.CompressionQuality:=   12;            // 1 mies, 100 am besten
         Jpg.ProgressiveEncoding:=   true;            // Schrittweise Aufbau beim Laden
         Jpg.PixelFormat:=            jf8Bit;         // jf24Bit oder jf8Bit
         Jpg.Compress;                              // Bild komprimieren
         Jpg.SaveToFile(SaveDialog1.FileName);      // Abspeichern
         Jpg.Free;
      End;
   End;
end;
Gruß, Alex

DeddyH 23. Aug 2008 09:01

Re: Image.Picture als JPEG Speichern????
 
Versuch es mal so (Reihenfolge geändert):
Delphi-Quellcode:
procedure TForm36.Button3Click(Sender: TObject);
Var
   Jpg :TJPEGImage;
begin
   If (Not Assigned(Image1.Picture.Graphic)) or Image1.Picture.Graphic.Empty Then
      MessageDlg('Kein Bild im Speicher',mtWarning,[mbOK],0)
   Else
     if SaveDialog1.Execute then
     Begin
       Jpg:=TJPEGImage.Create;
       try
         Jpg.CompressionQuality:=  12;
         Jpg.ProgressiveEncoding:=  true;
         Jpg.PixelFormat:=           jf8Bit;
         Jpg.Assign(Image1.Picture.Graphic);
         Jpg.Compress;
         Jpg.SaveToFile(ChangeFileExt(SaveDialog1.FileName,'.jpg'));    
       finally
         Jpg.Free;
       end;
     End;
end;

FAlter 23. Aug 2008 09:08

Re: Image.Picture als JPEG Speichern????
 
Hi,

Was ist es denn für ein Bils? Afair klappt TJpegFile.Assign nut, wenn ein TBitmap ge-assigned wird. Erzeuge dir euinn neues Birmap, male dort das Bild drauf (TBitmap.Canvas.Draw) und weise das zu, wenn du kein TBitmap hast.

Mfg
FAlter

DeddyH 23. Aug 2008 09:16

Re: Image.Picture als JPEG Speichern????
 
Mein Code tut auch ohne weitere Bitmap.

FAlter 23. Aug 2008 09:22

Re: Image.Picture als JPEG Speichern????
 
Hi,

auch bei ner Metafile? Ich glaube bei mir hat das damals nicht geklappt, und seitdem geh ich immer den Zwischenweg über ne Bitmap. Kann aber sein, dass inzwischen mit dem Assign(To) rumgespielt wurde.

Mfg
FAlter

DeddyH 23. Aug 2008 09:30

Re: Image.Picture als JPEG Speichern????
 
Nö, Metafile geht nicht, aber da kommt eine anständige Fehlermeldung, so dass die Frage überflüssig wäre.

Schwedenbitter 23. Aug 2008 09:53

Re: Image.Picture als JPEG Speichern????
 
Danke für die Hinweise. Kann sie grad nicht ausprobieren, weil ich kein Delphi zu Hand / auf dem PC habe.

Ich habe ein Formular mit einem TImage. In diese wird mittels DelphiTwain ein Bild eingelesen und auch angezeigt. Das möchte ich dann natürlich speichern und weil Bitmap zu groß ist, möchte ich es als jpeg packen...

Den Codevorschlag von DeddyH werde ich nachher - spätestens heute Abend - mal ausprobieren. Es wäre mir auch lieb, wenn ich den Code kurz halten und nicht nötige Objecte für Zwischenschritte sparen könnte.

Gruß, Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 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