Autor Beitrag
Anwender
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 62
Erhaltene Danke: 9



BeitragVerfasst: Do 17.01.13 00:05 
Hallo,

ich versteh die Welt nicht mehr.
Also .. ich möchte ein Bitmap laden/erzeugen und als JPEG komprimieren.
Aber auch gleich das Resultat als Vorschau in der Form anzeigen. Am besten natürlich ohne den Umweg über eine Datei.

Alle möglichen Beispiel im Internet erzeugen aber ein BMP (mit BMP.create) und laden eine Grafik hinein und speichern die als JPG in - genau, in eine Datei.

z.B. www.scalabium.com/faq/dct0042.htm

Nun, hab ich mir gedacht - könnte man die doch bestimmt auch nach dem Komprimieren direkt anzeigen.
Hab also folgendes geschrieben:

ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
uses jpeg;


procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
  Jpg: TJPEGImage;
begin
  Bmp := TBitmap.Create;
  Jpg := TJPEGImage.Create;


  image1.picture.LoadFromFile('C:\BILDER\Grafik_1.jpg');

  Bmp.assign(image1.picture.Bitmap);

// Exit;

  image1.picture.bitmap.assign(bmp); // Test, ob das Zurückschreiben geht

  Jpg.Assign(Bmp);

  Jpg.CompressionQuality := 90;

  JpG.compress;

//    Jpg.SaveToFile('C:\Temp\Grafik_Test.jpg');
  image2.picture.Bitmap.assign(jpg);

//image1.picture.assign(jpg); // geht auch nciht - Error 41 in JPEG -

  Jpg.Free;
  Bmp.Free;
end;
end;

end.



Mit dem Resultat, daß erst immer nach Durchlaufen der Buttonprozedur immer
"Error 41 in JPEG" kam. Also hab ich testweise entschlackt

und als ich dann selbst beim einfachen Zuweisen zu BMP
bmp.assign(image1.picture.bitmap);
und gleichzeitigem Weglassen des Restes der Prozedur (nach //Exit;) immer nur ein leeres Image1 anggezeigt bekam, war ich total verwundert.


Was mach ich denn falsch?
Danke



Edit:

Ebensowenig geht übrigens folgendes einfache Projekt,welches ich einfach von einer Seite herunterkopiert hab - weil ich dachte, meins wäre zu kompliziert.: [nur image1 und load ergänzt und die Bilder/Pfadnamen angepaßt]
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button3Click(Sender: TObject);
var jpeg: TJPEGImage;
  bmp: TBitmap;
begin
  jpeg := TJPEGImage.Create;
  bmp := TBitmap.Create;
  image1.Picture.LoadFromFile('C:\Bilder\Eins.jpg');
  try
    bmp.Assign(image1.Picture.bitmap);
    jpeg.CompressionQuality := 10;
    jpeg.Assign(bmp);

    jpeg.SaveToFile('C:\Bilder\Zorro.jpg');
  finally
    jpeg.Free;
    bmp.Free;
  end;
end;

d.h. wenn ich das Bild "Eins.jpg" lade kommt Zorro.jpg mit Größe NULL heraus.
Lese ich ein jpeg=>Bmp konvertiertes Bild "Eins.bmp" ein, funktioniert alles wunderbar.
WIESO???
gut, offenbar könnte es daran liegen, daß die in Image1 eingelesene Datei auch intern erstmal als JPEG weiterverbleibt, obwhol ich sie mit image1.picture.BITMAP auslese - das scheint wohl nichts zu bewirken. :(


Aber wie sonst soll man sonst JPEG Bilder als JPEG neukomprimieren können, ohne sie zuvor mit irfanview als BITMAP zu konvertieren?
Einloggen, um Attachments anzusehen!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 17.01.13 01:08 
TPicture ist ein Zugriffskomponente für verschiedenste TGraphics, TImage dient nur als "Leinwand" hierfür.
Wenn Du ein JPG lädst indem Du Image.Picture.LoadfromFile aufrufst versucht TPicture anhand der Endung zu erkennen was für eine Grafikklasse es erzeugen muss und ruft deren Laderoutine auf, TGraphics (bmp,jpg, auch eigene Klassen können implementiert und registriert werden) implementieren eigene Routinen für die in TGraphics definierten Routinen wie Draw, DrawTransparent etc.
Wenn Du ein JPG geladen hast und dann auf Image.Picture.BitMap zugreifst wird weil JPG kein TBitmap ist ein leeres TBitmap erzeugt und das Grafikobjekt (TJPGImage) freigegeben. Wenn Du den Source hast einfach mal Graphics.pas nachvollziehen.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Anwender Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 62
Erhaltene Danke: 9



BeitragVerfasst: Do 17.01.13 01:37 
ja, danke.

natürlich habe ich den Source zur Delphi 3 Pro.
jaja, ich weiß .. alt und so.

dennoch sollte sowas simples doch laufen.

Hab auch noch Delphi 7 Standard.



Nungut sowas dachte ich mir auch. Intern.

Aber wie kann ich das denn abändern?
Daß das fehlerfrei läuft?
Das geht ja Momentan nicht mal nur über jpeg.Save und image2.picture.Load?!?
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Do 17.01.13 05:27 
Anwender hat folgendes geschrieben:
Also .. ich möchte ein Bitmap laden/erzeugen und als JPEG komprimieren.
Aber auch gleich das Resultat als Vorschau in der Form anzeigen. Am besten natürlich ohne den Umweg über eine Datei.


Hier eine Möglichkeit über einen Stream. Das aktuelle Bild wird in Image1, das Resultat (die Vorschau) wird im Image2 angezeigt.

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:
25:
26:
27:
procedure TForm1.Button1Click(Sender: TObject);
var
  Jpg:TJPEGImage;
  MStream:TMemoryStream;
begin
IF OpenDialog1.Execute then
   BEGIN
    Jpg := TJPEGImage.Create;
     Jpg.LoadFromFile(OpenDialog1.FileName);
     Jpg.DIBNeeded;
     Image1.Picture.Bitmap.Assign(jpg);

     Jpg.CompressionQuality := 10;
     Jpg.compress;

     MStream:=TMemoryStream.Create;
      Jpg.SaveToStream(MStream);
      MStream.Seek(0,soFromBeginning);
      Jpg.LoadFromStream(MStream);
      Jpg.DIBNeeded;
      Image2.Picture.Bitmap.Assign(Jpg);
     MStream.Free;

//  Jpg.SaveToFile('E:\compress.jpg'); Speichern
    Jpg.Free;
   END;
end;


Gruß