jpg->Compress(); Fehler #36



  • Hallo zusammen,
    ich komprimiere ein Bild mit folgendem Code:

    TJPEGImage *jpg        = new TJPEGImage();
    Graphics::TBitmap *bmp = new Graphics::TBitmap();
      try
      {
        	         jpg->LoadFromFile(GetFile());
                      if(Bild->CompressionQuality>0)
                      {
                         bmp->Assign(jpg);
                         jpg->CompressionQuality = Bild->CompressionQuality;
                         jpg->Assign(bmp);
                         jpg->Compress();
                      }//if(Bild->CompressionQuality>0)
    
     }
    

    ....
    Seid neuesten tritt an der Stelle
    jpg->Compress();
    ein Fehler auf : "jpg Fehler #36"
    aber nur bei bestimmten 'CompressionQuality's'
    Bei meinem aktuellen Bild bei CompressionQuality 75 schalte ich es auf 50 ist alle O.K.
    (es kann aber auch vorkommen das bei anderen Bilder 50 den Fehler verursacht.)

    ICh habe den Code vor 2 Jahren geschreiben bis jetzt ging immer alles glatt und plötzlich tritt dieser Fehler auf.
    Ivh vermute das es daran liegt, dass die Kameras immer größere Auflösungen "fahren" 🙄

    Aber wie bekomme ich das obige Problem gelößt ?
    Kennt jemand diese Gegebenheit ? 😕

    danke
    P.S.
    Jpeg Fehler 36 ist :
    'Output file write error --- out of disk space?'

    Disk space ist OK. 🙄



  • Gegenfrage: Warum "assign"st du das Jpg zu einem Bmp und dann wieder zurück?

    Evtl. kann er dann die temp. Dateien nicht erzeugen und verursacht den Fehler.
    Es kann auch der 4GB Bug sein. Falls die Komponente den freien Speicherplatz abfragt und man nicht 0, sondern etwas mehr als 4,8,... freien Speicher hat, kann dieser Fehler auftreten (falls es eine ältere Version ist, welche BCB-Version verwendest du denn?).



  • mit dem Assign war ein überbleibsel (sorry gehört da nicht hin 🤡 )
    [copy & paste fehler 🙄 ]

    ich habe noch den BCB5.



  • 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





  • 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 ?? 😕 🙄


Anmelden zum Antworten