Autor Beitrag
Arbengie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66



BeitragVerfasst: Mo 17.10.11 11:36 
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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Mo 17.10.11 12:37 
So sollte es funktionieren !

ausblenden 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;

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Arbengie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66



BeitragVerfasst: Mo 17.10.11 13:11 
Jetzt kommt ein Runtime Error!

Screenshot

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Mo 17.10.11 13:19 
Da tippe ich mal auf "TBitMap.Create" vergessen (wegen der 0000)

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.

Für diesen Beitrag haben gedankt: Arbengie
Arbengie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Di 18.10.11 06:32 
Für Alle, die es in Zukunft nutzen !

Es geht auch mit dem direkten Aufruf von DIBNeeded:

ausblenden 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

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.

Für diesen Beitrag haben gedankt: Arbengie