Probleme bei JPEG Komprimieren
-
Habe ein Problem ein Jpeg zu Komprimieren. Bekomme immer den Fehler
JPEG-Fehler #41. Warum???TJPEGImage *jp = new TJPEGImage(); try { Image2->Picture->LoadFromFile(FileListBox1->FileName); jp->Assign(Image2->Picture->Graphic); jp->CompressionQuality = 20; jp->Compress(); jp->Smoothing = false; jp->Smoothing; Image2->Picture->Assign(jp); } __finally { delete jp; }
-
#41 bedeutet "empty input file".
http://homepages.borland.com/efg2lab/Library/Delphi/Graphics/JpegErrors.txtD.h. dein Image enthält vermutlich kein Bild oder ein nicht unterstützes Format.
-
Habe festgestellt das wenn ich das Bild schon im Image2 drin habe das der Fehler nicht kommt und alles funktioniert.
Der Fehler kommt erst wenn ich das Bild mit LoadFromFile Laden möchte und dann Komprimieren. Aber es ist das selbe Bild! Warum geht es auf die eine art und auf die andere nicht???
-
So kommt zwar kein Fehler, aber das Bild in Image2 ist erstaunlicherweise total unkomprimiert:

void __fastcall TForm1::Button1Click(TObject *Sender) { TJPEGImage *jp = new TJPEGImage(); try { Image1->Picture->Bitmap->LoadFromFile("d:\\Bilder\\Schnafzn.bmp"); jp->Assign(Image1->Picture->Bitmap); jp->CompressionQuality = 20; jp->Compress(); //Image1->Picture = NULL; Image2->Picture->Assign(jp); Image2->Height = jp->Height; Image2->Width = jp->Width; } __finally { delete jp; } }
-
Hallo F98,
der Fehler mit Image2, der verschwindet, wenn ein Bild schonmal geladen war hatte ich auch mal. Konnte ihn aber nicht reproduzieren, scheint aber an der Komponente TImage zu liegen.
Zum TJpegImage:
Ich verstehe die Methode Compress() laut der Borland Hilfe so, dass ein Bitmap zu einem JPEG komprimiert wird. Die Kompression sich so aber nicht in der Größe äußert...?!? Es hörte sich von dir so an, als ob du erwartest, dass sich die Größe ändert?!?
Ich werde aber auch mal rumprobieren, weil mich das Thema auch interessiert.
Gruß
Timmy
-
Hallo nochmal,
zu deinem letzten Thread:
Das Bild ist nicht unkomprimiert. Habe mal verschiedene CompressionQuality Werte ausprobiert. Du siehst es, wenn du das Bild aus Image2 als JPEG abspeicherst. In Abhängigkeit von CompressionQuality ändert sich die Dateigröße!
CompressionQuality hoch -> Datei groß und entsprechend.
Die Ausmaße vom Bild (
Image2->Height = jp->Height; Image2->Width = jp->Width;bleiben dann natürlich gleich. Es läuft halt nur ein Algorithmus über das geladene Bitmap und komprimiert dir ein JPEG draus.
Berichtige mich, wenn ich dir Blödsinn erzähle oder auf dem Holzweg bin...

Gruß
Timmy
-
Selbsverfreilich erwarte ich, dass eine Verlustbehaftete JPEG-Kompression stattfindet, nachdem ich jp->Crompress() ausführen lasse und nicht, dass sich width und height ändert.
Da ich das Bild explizit in einem JPEG-Objekt komprimieren lasse und dieses komprimierte Bild dann an ein TImage übergebe erwarte ich logischerweise eine Ausgabe/Anzeige des qualitativ schlechteren JPEG-Bildes. Tuts aber nicht, es zeigt statt dessen unerwarteterweise das verlustfreie Bitmap (?) an.

-
Weiß zwar nicht genau, ob ich hiermit jemandem helfe, aber passt ja zum Thema.
Habe nochmal ein wenig rumgesucht und probiert.
http://community.borland.com/article/0,1410,20164,00.html
http://community.borland.com/article/0,1410,15996,00.htmlDer erste Link beschreibt, wie man mit TImage->Canvas->StretchDraw(...) arbeitet. Dabei kann man ein Bitmap (oder ist es intern ein Jpeg??) verkleinern und es mit der Komponente TImage anzeigen.
Der zweite Link zeigt anhand eines Delphi Beispiels, wie man nun ein TImage in ein Jpeg umwandeln kann (oder so ähnlich). Das denke ich, würde benötigt werden, um ein TJpegImage nach ->Compress mit einem TImage anzuzeigen(inklusive Verlust!). Anscheinend funktioniert das ganze nur, wenn man zwischendurch in einer Tempdatei speichert.
Auf jeden Fall kann ich mein Problem, dass automatische verkleinern von Jpegs (alà IrfanView Batchkonvertierung) damit lösen.
Sorry wenn ich eunch mit langen Geschwafel nerve, aber vielleicht kanns ja einer gebrauchen.
Schönen Gruß und viel Spaß weiterhin
Timmy
-
Anscheinend braucht man eine Art Zwischenstufe, ich habe hier ein Client-Server-System gebastelt, was mir beliebig komprimierbare JPEG-Images (Screenshots vom Server) über das Netz überträgt und dann auf dem Client anzeigt
. Zwischendurch wird das Bild in einen Stream gesichert und auf der anderen Seite wieder aus dem Stream geladen. Jedenfalls funktioniert es auf diese Weise bei mir.
-
jay schrieb:
Habe ein Problem ein Jpeg zu Komprimieren. Bekomme immer den Fehler
JPEG-Fehler #41. Warum???TJPEGImage *jp = new TJPEGImage(); try { Image2->Picture->LoadFromFile(FileListBox1->FileName); jp->Assign(Image2->Picture->Graphic); jp->CompressionQuality = 20; jp->Compress(); jp->Smoothing = false; jp->Smoothing; Image2->Picture->Assign(jp); } __finally { delete jp; }BY BERRY
-
BERRY:
Was soll das?