Zugriffsverletzung bei Gdiplus::Image.Save



  • Hi

    ich hab wieder ein Problem, ich versuche mittels GDI+ ein JPG Bild in ein BMP zu konvertieren.

    Halbwegs funktioniert es auch, aber eben nicht ganz.

    Hier der Code:

    // Library Files
    #pragma comment(lib, "gdiplus.lib")
    
    // Header Files
    #include <gdiplus.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int GetEncoderClsid(const wchar_t *format, _GUID *pClsid)
    {
       unsigned int  num = 0;	  // number of image encoders
       unsigned int  size = 0;	 // size of the image encoder array in bytes
    
       ImageCodecInfo * pImageCodecInfo = NULL;
    
       GetImageEncodersSize(&num, &size);
       if(size == 0)
          return -1;  // Failure
    
       pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
       if(pImageCodecInfo == NULL)
          return -1;  // Failure
    
       GetImageEncoders(num, size, pImageCodecInfo);
    
       for(unsigned int j = 0; j < num; ++j)
       {
          if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
          {
             *pClsid = pImageCodecInfo[j].Clsid;
             free(pImageCodecInfo);
             return j;  // Success
          }    
       }
    
       free(pImageCodecInfo);
       return -1;  // Failure
    }
    
    void Example_SaveFile()
    {
        // Create an Image object based on a PNG file.
    	Gdiplus::Image  image(L"D:\\Temp\\TEST.jpg");
    	Gdiplus::Status stat;
    
        // Save the altered image.
        _GUID jpgClsid;
    	GetEncoderClsid(L"image/bmp", &jpgClsid);
    
    	stat = image.Save(L"D:\\Temp\\TEST.bmp", &jpgClsid, NULL);
    	if (stat == Gdiplus::Ok)
    		printf("%s was saved successfully\n");
    	else
    		printf("Failure: stat = %d\n", stat);
    }
    
    int main(void)
    {
    	struct Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    	struct Gdiplus::GdiplusStartupOutput gdiplusStartupOutput;
    	ULONG_PTR gdiplusToken;
    
    	Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, &gdiplusStartupOutput);
    
    	Example_SaveFile();		// Image Konvertieren
    
    	Gdiplus::GdiplusShutdown(gdiplusToken);
    
    	system("pause");
    	return 0;
    }
    

    ich kann hier erlich keinen fehler feststellen.
    Wenn ich das programm im Debugger starte erhalte ich die Exception Fehlermeldung.

    Wenn ich das Projekt erstelle und die EXE auserhalb ausführe, erhalte ich auch die Exception, ABER: Das Bild wird trotzdem richtig konvertiert und erscheint dann im Ordner!!

    Mit meinem bescheidenen anfängen in sache c++ kann ich da wohl noch nicht herausfinden was die ursache ist, desshalb hoffe ich dass hier jemand ist der mir die erklärung geben kann 🙂

    Gruß



  • *Wo* (schau im Debugger nach) tritt den die Access-Violation auf?



  • Oh nein, das tut weh! Ich musste es gerade auch selber durch den debugger laufen lassen um es zu sehen 🤡

    @UnIoN: Das kommt halt davon wenn man zuviel copy&paste betreibt!

    Schau dir doch das nochmal genauer an:

    if (stat == Gdiplus::Ok)
            printf("%s was saved successfully\n");
    


  • looool

    oh mann ist mir das peinlich *gg*

    aber ich muss auch erlich sagen, ich hatte gedacht dass es dem compiler nix ausmacht wenn er keinen parameter bekommt beim printf, dachte eigentlich der ignoriert dann einfach die auflösung des symbols...

    Naja, wieder was gelernt! Werd sowas bestimmt nicht nochmal machen ^^

    Vielen dank yogle! Hast mir den Tag gerettet!


Anmelden zum Antworten