将opencv图像转换为gdi位图不起作用取决于图像大小
Converting opencv image to gdi bitmap doesn't work depends on image size
我有这样的代码,可以将opencv图像转换为位图:
void processimage(MAT imageData)
{
Gdiplus::Bitmap bitmap(imageData.cols,imageData.rows,stride, PixelFormat24bppRGB,imageData.data);
// do some work with bitmap
}
当图像大小为2748 X 3664时,它运行良好。但我正在尝试处理一个尺寸为1374 X 1832的图像,它不起作用。
错误是无效的参数(2)。
我检查了一下,可以确认:
2748*3664:
- cols=2748
- 行=3664
- 步幅=8244
- 图像继续
在1374 X 1832 中
- cols=1374
- 行=1832
- 步幅=4122
- 图像继续
所以在我看来一切都是正确的,但它会产生错误。
问题出在哪里?我该如何解决?
编辑
基于解释为什么我不能创建位图的答案。我最终以这种方式实现了它:
Mat newImage;
cvtColor(imageData, newImage, CV_BGR2BGRA);
Gdiplus::Bitmap bitmap(newImage.cols,newImage.rows,newImage.step1(), PixelFormat32bppRGB,newImage.data);
因此,我有效地将输入图像转换为每像素4字节,然后使用将其转换为位图。
感谢罗杰·罗兰的回答。
我认为问题在于BMP格式的步长必须是4的倍数。
较大图像的步幅为8244,这是有效的(8244/4=2061),但较小图像的步距为4122,这不是(4122/4=1030.5)。
正如MSDN上对步幅参数所说(我强调):
指定一个的开头之间的字节偏移量的整数扫描行和下一行。这通常(但不一定)像素格式的字节数(例如,每个16位为2像素)乘以位图的宽度。传递给此的值参数必须是四的倍数。
假设您的步幅是正确的,我认为您唯一的选择就是逐行复制。所以,类似于:
- 非常适合所需大小和格式的
Gdiplus::Bitmap
- 使用LockBits获取位图像素数据
- 一次复制一行OpenCV图像
- 调用UnlockBits以释放位图数据
您可以使用我的类CGdiPlus,它实现了从cv::Mat转换为Gdiplus::Bitmap所需的所有功能,反之亦然:
OpenCV/Tesseract:如何用GDI+位图替换libpng、libtiff等(通过GDI+加载到cv::Mat)
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- glTexImage2D 不起作用,但将 FragColor 设置为 vec4(1.0, 0, 0, 1.0) 会给我红色图像
- 与 alpha 通道的图像重叠在 QT 上不起作用
- SDL_2加载图像不起作用
- 使用16位签名格式打开CV不起作用..裁剪图像并重新调整图像大小
- 旋转图像不起作用
- 将opencv图像转换为gdi位图不起作用取决于图像大小
- 为什么我的 OpenCL 3D 图像查找不起作用?
- 使用VideoCapture读取目录中的图像不起作用
- 我的加载图像不起作用 - 我需要知道为什么
- 从资源加载图像不起作用(C++ Dll)