我是使用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中写这篇文章(我也是新手)。
如果图像未加载,我的输出是:
答案 0 :(得分:1)
答案是你所有答案的组合。我的一个八位字节在我的CLSID中出错了,输出路径不在当前用户的触及范围内。并且我的Bitmap构造函数的输入参数要求Stride参数(我将image.step1()推入的那个)可以被4整除。我收到的状态错误代码2来自我的Bitmap构造函数