jpg->Compress(); Fehler #36
-
Also mir ist aufgefallen, dass ich die beiden Assign Zeilen nicht weglassen darf, sonst wird gar kein BIld mehr komprimiert

Ich war irrtümlicherweise der Meinung das dies ein Überbleibsel war vom drehen des Bildes.
Obwohl ich ja erst bmp->Assign(jpg) mache, dann etwas mit jpg mache und dann dem jpg erst wieder das bmp Assigne
.Hmmmm.
Ohne dies geht es aber gar nicht mehr.
-
Das ist doch aber eigentlich total unnütz.
Normalerweise reicht doch:void __fastcall TForm1::Button1Click(TObject *Sender) { TJPEGImage *jp = new TJPEGImage(); jp->LoadFromFile("c:\\test.jpg"); jp->CompressionQuality = 20; // 1 ... 100 jp->Compress(); ... delete jp; }
-
Hallo F98,
tust Du mir bitte mal ein Gefallen und PAstest diesen Code in dein Projekt
und schaust wie groß die Datei xx2.jpg ist ?
Bei mir 0 KB
TJPEGImage *jpg = new TJPEGImage(); try { jpg->LoadFromFile("c:\\test.jpg"); jpg->CompressionQuality =50;//(int)Bild->CompressionQuality; jpg->Compress(); } catch(...) { ShowMessage("Fehler beim Compress."); } jpg->SaveToFile("C:\\xx2.jpg"); delete jpg;Habe ich jetzt völlig den Durchblick verlohren ?????

-
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.