c++ - 将 opencv 图像转换为 gdi 位图不起作用取决于图像大小

标签 c++ image opencv bitmap

我有将 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 字节,然后使用将其转换为位图。

感谢 Roger Rowland 的回答。

最佳答案

我认为问题在于 BMP 格式的步幅必须是 4 的倍数。

您的大图的步幅为 8244,这是有效的 (8244/4 = 2061),但您的小图的步幅为 4122,这不是 (4122/4 = 1030.5)。

作为it says on MSDN对于 stride 参数(我强调):

Integer that specifies the byte offset between the beginning of one scan line and the next. This is usually (but not necessarily) the number of bytes in the pixel format (for example, 2 for 16 bits per pixel) multiplied by the width of the bitmap. The value passed to this parameter must be a multiple of four.

假设您的步幅是正确的,我认为您唯一的选择是逐行复制它。所以,像这样:

  1. 很棒的 Gdiplus::Bitmap 所需的大小和格式
  2. 使用LockBits获取位图像素数据。
  3. 一次复制一行 OpenCV 图像。
  4. 调用UnlockBits释放位图数据。

关于c++ - 将 opencv 图像转换为 gdi 位图不起作用取决于图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20743134/

相关文章:

python - cv2.contourArea 无法正常工作

java - 有哪些好的开源程序可以对流行的图像文件类型进行模糊测试?

python - 如何在python中的感兴趣区域周围绘制一个矩形

opencv - 减法框架opencv

python - 在Python中读取给定目录中的图像文件

c++ - 成功运行 10 小时后,Windows 应用程序在 Release模式下出现异常,如何检测到哪里出了问题?

c++ - 将静态方法作为参数传递,不需要地址运算符?

c++ - 如果我使用较新版本的 gcc 编译二进制文件,如何找到需要在客户端 linux 机器上安装哪些库?

c++ - 正则表达式语法 - 帮助

java - 使用按钮 Swing 更改图像