jpg->Compress(); Fehler #36
-
Wenn Du das gleiche raus hast wie ich probier das bitte mal :
TJPEGImage *jpg = new TJPEGImage(); Graphics::TBitmap *bmp = new Graphics::TBitmap(); try { jpg->LoadFromFile("c:\\test.jpg"); bmp->Assign(jpg); jpg->Assign(bmp); jpg->CompressionQuality =20;//(int)Bild->CompressionQuality; jpg->Compress(); } catch(...) { ShowMessage("Fehler beim Compress."); } jpg->SaveToFile("C:\\xx2.jpg"); delete jpg;
-
Öhm, irgendwie bin ich jetzt auch ratlos. Ohne das assign kommt, wie schon festgestellt eine Datei mit der Länge "0" raus. Bloß durch das Assign mit dem Bitmap funktionierts dann ... hm
Ich habe den letzteren Code mal mit einem Image erweitert, um mir sofort das Ergebnis anzeigen zu lassen:
TJPEGImage *jpg = new TJPEGImage(); Graphics::TBitmap *bmp = new Graphics::TBitmap(); jpg->LoadFromFile("c:\\Temp\\sq15.jpg"); bmp->Assign(jpg); jpg->Assign(bmp); jpg->CompressionQuality = 1; jpg->Compress(); jpg->SaveToFile("c:\\Temp\\sddf.jpg"); Image1->Height = jpg->Height; Image1->Width = jpg->Width; Image1->Picture->Assign(jpg); delete jpg; delete bmp;Funktioniert aber auch nicht so richtig, da in Image1 nicht das Compressed-Jpeg, sondern das originale zu sehen ist. Kann mir das mal jemand erklären?
-
Erst mal Danke für Deine Mühe F98

Ich habe langsam an meinem Verstand gezweifelt

Sollte ich mir noch überlegen zum Forumtreffen zu kommen und Du zufällig auch dabei sein, gebe ich ein Bier aus

-
Hallo ihr beiden,
Ich habe im web mal das hier gefunden
http://delphi.pjh2.de/articles/graphic/bitmap.php#JPEG
Ist zwar Delphi, beschreibt aber in etwa euren Sachverhalt. Vielleicht hilft das ja.Ciao
-
Der Link sah ganz vielversprechend aus ....
Jetzt sieht mein Code so aus:jpg->LoadFromFile("c:\\juergen2.jpg"); bmp->Assign(jpg); jpg->CompressionQuality =iqual; jpg->Assign(bmp); jpg->ProgressiveEncoding=true; // <-- NEU jpg->Smoothing=false; // <-- NEU jpg->Compress(); jpg->SaveToFile("C:\\xx" + IntToStr(iqual)+ ".jpg");der Effekt ist der selbe, als wenn ich
bmp->Assign(jpg);und
jpg->Assign(bmp);weg lasse (Dateigroesse 0KB )
.
trotzdem danke
-
Tja, da scheint wohl TJpegImage etwas buggy zu sein.
-
Gab es da nicht noch irgendeine Eigenschaft bezüglich der ImageQuality? Schon mal damit experimentiert?
-
Nei , habe ich noch nicht mit experimentiert.
Werde der Sache mal auf den Grund gehen.
-
Hmm. ich finde nur die CompressionQuality

-
YLIREBUS schrieb:
Hmm. ich finde nur die CompressionQuality

Genau das meine ich.
-
Damit arbeiten wir doch schon die ganze Zeit
.
siehe oben
-
ein weiterer Link
http://www.delphipraxis.net/post66158.html
-
Wie im Deplhi-Forum beschrieben funktionierts:
void __fastcall TForm1::Button1Click(TObject *Sender) { TJPEGImage *jpg = new TJPEGImage(); try { jpg->LoadFromFile("c:\\Temp\\sq15.jpg"); jpg->CompressionQuality = 1; // 1..100 jpg->DIBNeeded(); jpg->Compress(); jpg->SaveToFile("c:\\Temp\\compressed.jpg"); } catch ( ... ) { ShowMessage("Compression error."); } delete jpg; }
-
@F98 probier das bitte mal mit Compress 60.
Danke Braunstein, aber auch das ändert leider nichts.
Das Problem ist das es mit einigen "CompressionQuality's" funzt und mit anderen nicht.
Fals jemand irgendwann auch auf diese Problem Stößt hier mal die Fakten:
Borland C++ Builder5
Mein derzeitiger CODE:
jpg->LoadFromFile("c:\\juergen2.jpg"); bmp->Assign(jpg); jpg->CompressionQuality =iqual;//(int)Bild->CompressionQuality; jpg->Assign(bmp); jpg->DIBNeeded(); jpg->ProgressiveEncoding=true; jpg->Smoothing=true; jpg->Compress(); jpg->SaveToFile("C:\\xx" + IntToStr(iqual)+ ".jpg");LOG:
Ursprungsdaeit 15.800 KB (juergen2.jpg)
Uebersicht: (Größen der Target-Datein)
CompressionQuality(ohne jpg->ProgressiveEncoding=true; und jpg->Smoothing=true; und jpg->DIBNeeded())
10 --> FEHLER
20 --> FEHLER
30 --> 2170 KB
40 --> 2495 KB
50 --> 2810 KB
60 --> FEHLER
70 --> FEHLER
80 --> 4449 KB
90 --> 6325 KB
100 --> O.K+ jpg->ProgressiveEncoding=true;
+ jpg->Smoothing=true;10 982 KB
20 immer noch Fehler
30 jetzt Fehler
40 2330 KB
50 2657 KB
60 3002 KB
70 immer noch Fehler
80 4283 KB
90 jetzt Fehler
100 14970+ jpg->DIBNeeded(); --> Das selbe Ergebnis wie ohne.
Die Klasse ist denke ich ja Delphi Code...
Meine letzte Überlegung ist jetzt die MFC Klasse zu nehmen das Bild zu komprimiern, dann speichern und dann wieder zu laden.Ist das jetzt zu weit hergeholt ??

-
Durch
jpg->DIBNeeded();fällt auf alle Fälle schon einmal
bmp->Assign(jpg);und
jpg->Assign(bmp);weg.
-
Klappt bei mir bei jeder Quality-Einstellung.
Bei codeproject.com hat jemand eine feine Klasse geschrieben, allerdings für VC:
-
Wie groß ist Dein Bild ?
nimm mal bitte eins was 8 MB gross ist oder groesse.
-
Meins war 40kB groß, eins was 8MB groß ist habe ich nicht.
-
Dann puste es doch auf (habe ich mit meinem auch gemacht
)
-
So, hab ich gemacht, auf 11MB. Das Ergebnis ist das Selbe: Es funktioniert bei mir mit allen CompressionQuality-Einstellungen problemlos. Hast Du mal ein anderes Bild probiert als das, was Du jetzt verwendest?