Probleme mit Gdiplus



  • Hallo zusammen,

    ich hab schon mal einen Thread über die Benutzung von GDI+ gepostet, diesen Fehler hab ich aber inzwischen lösen können. Inzwischen hat sich allerdings ein neues Problem eingeschlichen, ich bekomme zur Zeit immer folgende Fehlermeldung:

    [Linker Fehler] Unresolved external '_EncoderCompression' referenced from D:\UMIT\DATAMINING\C++ BUILDER\MAINFRAME.OBJ

    Ich verwende folgenden Code der bis auf die Anweisung .Guid = EncoderCompression funktioniert.

    using namespace Gdiplus;
        Image *GDIPlusImage;
        CLSID encoderClsid;
        EncoderParameters *encoder;
        encoder = new EncoderParameters();
        ULONG parameterValue;
        encoder->Count = 1;
        encoder->Parameter[0].Guid = EncoderCompression;
        encoder->Parameter[0].Type = EncoderParameterValueTypeLong;
        encoder->Parameter[0].NumberOfValues = 1;
        encoder->Parameter[0].Value = &parameterValue;
        parameterValue = EncoderValueCompressionNone;
    
        imKMeans->Picture->Bitmap->SaveToFile(projectName + "_cl_km" + ".bmp");
        GDIPlusImage = new Image(L"frst_cl_km.bmp");
        GetEncoderClsid(L"image/tiff", &encoderClsid);
        GDIPlusImage->Save(L"GDIImage.tiff", &encoderClsid, encoder);
    

    Die Include-Dateien und Lib sind alle eingebunden. Die Methode GetEncoderClsid funktioniert auch, wie gesagt, EncoderCompression verursacht einen Fehler. Die TIFF-Bild Speicherung funktioniert, aber ich mache das Ganze, damit das Bild nicht komprimiert wird, was sehr wichtig ist. Hat jemand Ideen?



  • Nach längerem Durchforsten der Headerfiles von GDI+ bin ich auf eine Lösung gekommen. Da die Parameter (EncoderCompression, EncoderColorDepth, etc.) für den GUID (globally unique identifier) in dem Headerfile guiddef.h und gdiplusimaging.h mittels Makro definiert sind, und wahrscheinlich das Makrohandling von einem Microsoft Präprozessor unterschiedlich funktioniert als das von einem Borland Präprozessor, bekommt man Unresolved external-Fehlermeldungen.

    Eine Lösung des Problems - wenn weitere bekannt sind, dann bin ich sehr neugierig darauf - ist das explizite Setzen der Parameterwerte, im Header guiddef.h ist das Format und in gdiplusimaging.h sind die Parameter definiert. Ein Beispiel für ein TIFF-Bild, das ohne Komprimierung gespeichert werden soll (Default ist Komprimierung):

    //...
       using namespace Gdiplus;
    
       Image *GDIPlusImage;
       CLSID encoderClsid;
       EncoderParameters *encoder = new EncoderParameters();
       ULONG parameterValue;
       GUID EncoderCompression = {0xe09d739d,0xccd4,0x44ee,{0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58}};  // aus Header guiddef.h
    
       encoder->Count = 1;
       encoder->Parameter[0].Guid = EncoderCompression;
       encoder->Parameter[0].Type = EncoderParameterValueTypeLong;
       encoder->Parameter[0].NumberOfValues = 1;
       encoder->Parameter[0].Value = &parameterValue;
    
       parameterValue = EncoderValueCompressionNone;
       GDIPlusImage = new Image(L"test.bmp");
       GetEncoderClsid(L"image/tiff" , &encoderClsid);  //Diese Methode ist in MSDN Hilfe zu finden
       GDIPlusImage->Save(L"test.tiff", &encoderClsid, encoder);
    
       //...
    

    Das explizite Setzen ist nur für GUID-Parameter erforderlich, alle anderen sind als enum definiert.
    Auch wenn die Verwendung des GDI+ nicht so einfach erscheint ist sie doch von ihrer Funktionalität sehr zu empfehlen.


Log in to reply