为什么我的Gdiplus :: Bitmap不会保存文件

时间:2017-03-23 18:53:23

标签: c++ opencv winapi bitmap gdi+

我是使用GDI +的新手,我正在为我的个人项目做一个概念验证。

对于此代码段,我基本上希望将cv::Mat转换为位图并将文件保存到任意路径。

我的转换过程改编自StackOverflow答案:

How to convert an opencv mat image to gdi bitmap

我的问题是,当我致电bitmap.Save()时,会返回错误代码2(InvalidParameter)。

我不明白为什么我的一个或多个输入参数是错误的。

cv :: Mat初始化

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

show_image_from_mat函数

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;
}

我从Does GDI+ have standard image encoder CLSIDs?获得了CLSID憎恶。

我在Visual Studio中写这篇文章(我也是新手)。

如果图像未加载,我的输出是:

image

1 个答案:

答案 0 :(得分:1)

答案是你所有答案的组合。我的一个八位字节在我的CLSID中出错了,输出路径不在当前用户的触及范围内。并且我的Bitmap构造函数的输入参数要求Stride参数(我将image.step1()推入的那个)可以被4整除。我收到的状态错误代码2来自我的Bitmap构造函数