[c++] Gdiplus::Image::save



  • Hallo,

    Ich bekomme in folgendem Code einen Fehlerstatus zurück, den ich selbst mit Hilfe Googles nicht deuten kann.

    void copyHBitmap(wchar_t* path, wchar_t* codec)
    {
        GdiplusStartupInput gdiplusStartupInput;
        GdiplusStartup(&gdiplusToken /*Klassenmember*/, &gdiplusStartupInput, NULL);
    
        CLSID encoderClsid;
        BOOL result = getEncoderClsId(codec, &encoderClsid);
        if (!result)
        {
            std::cout << "Codec nicht gefunden." << std::endl; // Wird nicht angezeigt, Codec sollte also da sein
            return;
        }
    
        Bitmap bitmap(L"quelle.bmp");
        int err = bitmap.Save(path, &encoderClsid, NULL);
        if (err == 0) // Ok
        {
            std::cout << "Bild gespeichert." << std::endl;
        }
        else
            std::cout << "Image::Save-Fehler: " << err << std::endl; // Wird angezeigt
    }
    

    Die Funktion getEncoderClsId() ist Copy&Paste aus dem Web:

    BOOL getEncoderClsId(wchar_t* wchMimeType, CLSID* clsidEncoder)
    {
        UINT uiNum   = 0;
        UINT uiSize  = 0;
        BOOL bOk     = FALSE;
    
        ImageCodecInfo* pImageCodecInfo = NULL;
    
        GetImageEncodersSize(&uiNum, &uiSize);
    
        if( uiSize > 0 )
        {
            pImageCodecInfo = (Gdiplus::ImageCodecInfo *)new char[uiSize];
    
            if( pImageCodecInfo )
            {
                Gdiplus::GetImageEncoders(uiNum, uiSize, pImageCodecInfo);
    
                for( UINT i = 0; i < uiNum; i++ )
                {
                    if( wcscmp(pImageCodecInfo[i].MimeType, wchMimeType) == 0 )
                    {
                        clsidEncoder = &pImageCodecInfo[i].Clsid;
                        bOk = TRUE;
                    }
                }
            }
    
            delete pImageCodecInfo;
        }
    
       return bOk;
    }
    

    Ich rufe auf: copyHBitmap(L"quelle.bmp", L"image/bmp");

    Die Zieldatei wird angelegt, ist anschließend aber 0 Byte groß.
    Gleichzeitig gibt bitmap.Save() Status 10 zurück und der steht für FileNotFound.
    quelle.bmp ist 100%ig vorhanden und ein gültiges Bitmap.

    Habe versucht, die Datei schon vor der Ausführung anzulegen, mit oder ohne Inhalt. In jedem Fall habe ich hinterher die 0 Byte große Datei und den Fehlerstatus 10.

    Übersehe ich etwas ganz simples... ?



  • Frag mal nach dem Status direkt nach
    Bitmap bitmap(L"quelle.bmp");
    mittels. bitmap.GetLastStatus()

    ...und probier mal nen vollständigen Pfad.



  • Das Problem liegt in der Übergabe der CLSID aus der Funktion getEncoderClsId.
    Das Array "pImageCodecInfo" wird in dieser Funktion gelöscht und damit ist der Pointer auf einen Eintrag im Array ungültig. Gib die CLSID mit "*clsidEncoder = pImageCodecInfo[i].Clsid;" zurück. Dann ist die CLSID auch außerhalb der Funktion gültig, da keine Referenz sondern der Inhalt gespeichert wird.


Log in to reply