jpg->Compress(); Fehler #36



  • 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





  • 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:

    http://www.codeproject.com/bitmap/cximage.asp



  • 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 🙄 )


Anmelden zum Antworten