Kennt jemand GDI-Plus?



  • Hallo

    Um ein TIF-Bild in ein Bitmap umzuwandeln, habe ich aus dem Codeguru folgenden Code entnommen und angepasst:

    #include "Gdiplus.h"
            using namespace Gdiplus;
            #pragma comment(lib, "gdiplus.lib")
    
            -------------------
    
        GdiplusStartupInput gdiplusStartupInput; 
        ULONG_PTR gdiplusToken; 
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 
    
        Image Im = (L"C:\\Testfile.TIF");
    
        CLSID BmpCodec; 
        GetImageCLSID(L"image/bmp", &BmpCodec); 
        Im.Save(L"C:\\Testfile.bmp", &BmpCodec, NULL); 
    
        GdiplusShutdown(gdiplusToken); 
    
            ---------------
    
            int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
            { 
    
            UINT num = 0; 
            UINT size = 0; 
            ImageCodecInfo* pImageCodecInfo = NULL; 
            GetImageEncodersSize(&num, &size); 
            if(size == 0) 
               return FALSE; 
            pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); 
    
            if(pImageCodecInfo == NULL) 
               return FALSE; 
            GetImageEncoders(num, size, pImageCodecInfo); 
            for(UINT i = 0; i < num; ++i) 
            { 
               if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 ) 
               { 
                   *pCLSID = pImageCodecInfo[i].Clsid; 
                   free(pImageCodecInfo); 
                   return TRUE; 
               } 
            } 
            free(pImageCodecInfo); 
            return FALSE; 
    }
    

    Funktioniert auch alles soweit so gut, aber nachdem das Bitmap erzeugt wurde, kommt im Destruktor von gdiplusbitmap.h

    Image::~Image()
    {
        DllExports::GdipDisposeImage(nativeImage); // Hier
    }
    

    folgende Fehlermeldung:

    Unbehandelte Ausnahme bei 0x7a0a24f6 in MeinProgramm.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x01cf3994.

    Kann jemand damit was anfangen? Ich benutze VS .NET 2002

    Vielen Dank!



  • Setz mal die vier Zeilen zwischen GdiplusStartup und GdiplusShutdown in einen {}-Block.



  • Hey genial, hat geklappt. Danke vielmals!

    Kannst du mir aber noch verklickern, warum das was gebracht hat?



  • // fülle Schwimmbecken mit Wasser
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    // schwimme
    Image Im = (L"C:\\Testfile.TIF");
    CLSID BmpCodec;
    GetImageCLSID(L"image/bmp", &BmpCodec);
    Im.Save(L"C:\\Testfile.bmp", &BmpCodec, NULL);

    // entferne Wasser
    GdiplusShutdown(gdiplusToken);
    // Error: Schwimmen nicht möglich

    In geschweiften Klammern wird am Ende das Objekt zerstört -> der Schwimmer steigt von alleine aus dem Wasser, bevor das Wasser entfernt wurde

    😉 😉



  • Naja, ich glaube, in deinem Büro ist es etwas warm und du träumst nur noch davon, möglichst bald ins kühle Nass springen zu können 🙂 (nur zu verständlich)

    Ich hoffe jedenfalls, dass ich es verstanden habe.
    Danke and have a nice and long weekend!



  • ich glaube, in deinem Büro ist es etwas warm

    Ja, es ist verdammt warm 😉


Anmelden zum Antworten