Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - JPEG komprimieren


Arbengie - Mo 17.10.11 11:36
Titel: JPEG komprimieren
Hi, ich bins wieder :)

diesmal habe ich folgendes Problem.
Ich lade ein jpeg Bild, will das dann komprimieren und dann auf em Desktop speichern.
Das Bild wird auch auf dem Desktop erstellt, nur wenn man das Bild öffnet, wird angezeigt "Beim Öffnen des Bildes ist ein Fehler aufgetreten", d.h. ich mache wohl irgendwas falsch, nur weiß ich nicht was...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TfrmMain.btnGoClick(Sender: TObject);
var
  i: integer;
  jpeg: TJpegImage;
  name: string;
begin
  name := edtName.Text;
  jpeg := TJpegImage.Create;
  for i := 0 to dlgOpen.Files.Count - 1 do
  begin
    jpeg.loadfromfile(picList[i]); // funktioniert
    jpeg.CompressionQuality := barQuality.Position; // funktioniert
    jpeg.Compress; // hier ein Fehler vllt. ?
    jpeg.SaveToFile(savePfad + '\' + name + inttostr(i) + '.jpg'); // funktioniert
  end;
  jpeg.free;
end;


chrisw - Mo 17.10.11 12:37

So sollte es funktionieren !


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TfrmMain.btnGoClick(Sender: TObject);
var
  i: integer;
  jpeg: TJpegImage;
  name: string;
  tempBMP : TBitMap;     //////////////////////////
begin
  name := edtName.Text;
  jpeg := TJpegImage.Create;
  tempBMP := TBitMap.Create;     //////////////////////////
  for i := 0 to dlgOpen.Files.Count - 1 do
  begin
    jpeg.loadfromfile(picList[i]); // funktioniert
    tempBMP.Assign(jpeg);   /////////////////////////
    // hier solltest du noch abfangen, dass barQuality.Position nicht < 1 oder > 100 sein darf, wobei eine Kompression   
    // unter 50 % m.E. kaum Sinn macht, also solltest du lieber abfangen dass barQuality.Position nicht < 50 oder > 100 
    // sein darf
    jpeg.CompressionQuality := barQuality.Position; // funktioniert
    jpeg.Compress; // hier ein Fehler vllt. ?
    jpeg.SaveToFile(savePfad + '\' + name + inttostr(i) + '.jpg'); // funktioniert
  end;
  jpeg.free;
  tempBMP.free;    ////////////////////
end;


Arbengie - Mo 17.10.11 13:11

Jetzt kommt ein Runtime Error!

Screenshot

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.


chrisw - Mo 17.10.11 13:19

Da tippe ich mal auf "TBitMap.Create" vergessen (wegen der 0000)


Arbengie - Mo 17.10.11 13:40

Ah danke, jetzt klappts ;).

Nur eine Sache verstehe ich nicht mit dem Bitmap.
Wir createn ein Bitmap und was genau macht assign()?
Laut meinen Englischkenntnissen müsste es sowas wie "zuweisen" sein.

Wir erstellen das Bitmap, weisen es dem Jpeg zu, aber sonst passiert doch damit gar nichts?
Das verstehe ich nicht ganz.

MfG


chrisw - Di 18.10.11 06:32

Für Alle, die es in Zukunft nutzen !

Es geht auch mit dem direkten Aufruf von DIBNeeded:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TfrmMain.btnGoClick(Sender: TObject);
var
  i: integer;
  jpeg: TJpegImage;
  name: string;
begin
  name := edtName.Text;
  jpeg := TJpegImage.Create;
  for i := 0 to dlgOpen.Files.Count - 1 do
  begin
    jpeg.loadfromfile(picList[i]); 
    jpeg.DIBNeeded; 
    jpeg.CompressionQuality := barQuality.Position; 
    jpeg.Compress; 
    jpeg.SaveToFile(savePfad + '\' + name + inttostr(i) + '.jpg'); 
  end;
  jpeg.free;
end;


Christian