2017-03-23 5 views
0

Ich bin neu in GDI + und ich mache einen Proof of Concept für ein persönliches Projekt von mir.Warum speichert mein Gdiplus :: Bitmap keine Datei

Für dieses Codesegment möchte ich im Wesentlichen eine cv::Mat in eine Bitmap konvertieren und die Datei in einem beliebigen Pfad speichern.

ist mein Umwandlungsprozess von dieser Antwort angepasst Stackoverflow:

How to convert an opencv mat image to gdi bitmap

Mein Problem ist, dass, wenn ich bitmap.Save() nennen, es gibt einen Fehlercode von 2 (InvalidParameter).

Ich verstehe nicht, warum einer oder mehrere meiner Eingabeparameter falsch ist.

cv :: Mat Initialisierung

cv::Mat mat = cv::Mat::ones(768, 1366, CV_8UC3); 
show_image_from_mat(mat); 

Die show_image_from_mat Funktion

int show_image_from_mat(cv::Mat image) 
{ 
    cv::Size size = image.size(); 
    GdiplusStartupInput gdiplusStartupInput; 
    ULONG_PTR   gdiplusToken; 
    // Initialize GDI+. 
    printf("================================================================"); 
    printf("\n%i StarupStatus ",GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL)); 
    // gdiplus 
    Gdiplus::Bitmap bitmap(size.width, size.height, image.step1(), PixelFormat24bppRGB, image.data); 
    CLSID bmpClsid; 
    printf("\n%p result", CLSIDFromString(L"{557cf400-1a04-11d3-9a73-0000f81ef32e}",&bmpClsid)); 
    printf("\n%p clsid", bmpClsid); 
    const WCHAR* filename = L"C:\\output.bmp"; 
    char shortfilename[15];//You will need to malloc if you need to handle arbitrary filenames. 

    printf("\n%i ErrorCode",bitmap.Save(filename, &bmpClsid,NULL)); 
    wcstombs(shortfilename, filename, 15); 
    show_image_from_file(shortfilename); 
    GdiplusShutdown(gdiplusToken); 
    return 9001; 
} 

Ich habe die CLSID Gräuel von Does GDI+ have standard image encoder CLSIDs?.

Und ich schreibe dies in Visual Studio (ich bin auch neu dazu).

Wenn das Bild nicht geladen, ist mein Ausgang dieses:

image

+0

Ich bin mir nicht sicher, welchen Punkt es gibt, eine CLSID als Zeiger zu drucken. Und Sie haben den Code nicht angezeigt, in dem Sie tatsächlich versuchen, das Bild zu speichern. Aber meine beste Vermutung ist, dass Sie versuchen, eine Datei in das Stammverzeichnis von C: zu schreiben und (sofern Sie die UAC nicht deaktiviert haben) dies nur möglich ist, wenn Ihr Programm erhöht ist. –

+0

Ich wollte nur sicherstellen, dass die CLSID tatsächlich Daten enthielt. Ich habe versucht, den Pfad zu einem Ordner auf meinem Desktop zu wechseln, aber Bitmap.Save() gibt immer noch den Fehlercode 2 zurück. Bitmap.save schreibt die Datei auf die Festplatte. Bitmap erbt die Save-Methode von gdiplus 'Image-Klasse –

+1

Sie können eine 'CLSID' nicht direkt an' printf() 'übergeben, Sie müssen stattdessen die einzelnen Felder ausdrucken:' printf ("\ n% 08X-% 04X-% 04X-% 02X% 02X-% 02X% 02X% 02X% 02X% 02X% 02X clsid ", bmpClsid.Data1, bmpClsid.Data2, bmpClsid.Data3, bmpClsid.Data4 [0], bmpClsid.Data4 [1], bmpClsid. Data4 [2], bmpClsid.Data4 [3], bmpClsid.Data4 [4], bmpClsid.Data4 [5], bmpClsid.Data4 [6], bmpClsid.Data4 [7]); 'Andernfalls übergeben Sie die' CLSID' an 'StringFromCLSID()' oder ähnliche Funktion, und drucken Sie dann die resultierende Zeichenfolge. –

Antwort

1

Die Antwort eine Kombination all Ihre Antworten war. Einer meiner Oktetts war in meiner CLSID falsch. Der Ausgabepfad war nicht in Reichweite des aktuellen Benutzers. Und die Eingabeparameter für meinen Bitmap-Konstruktor erforderten, dass der Parameter Stride (der, in den ich image.step1() hineinschiebe) durch 4 teilbar ist. Der Statusfehlercode, den ich von 2 erhalten hatte, wurde von meinem Bitmap-Konstruktor übernommen: