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

 独孤依人x_762 发布于 2023-02-08 14:50

我有这个代码将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

stride = 8244

图像继续.

在1374 X 1832

COLS = 1374

行= 1832

stride = 4122

图像继续.

所以一切对我来说都是正确的,但它会产生错误.

有什么问题,我该如何解决?

编辑

根据答案解释了为什么我无法创建位图.我终于以这种方式实现了它:

   Mat newImage;
   cvtColor(imageData, newImage, CV_BGR2BGRA);
   Gdiplus::Bitmap bitmap(newImage.cols,newImage.rows,newImage.step1(), PixelFormat32bppRGB,newImage.data);

如此有效,我将输入图像转换为每像素4字节,然后使用转换为位图.

所有归功于Roger Rowland 的答案.

1 个回答
  • 我认为问题是BMP格式的步幅必须是4的倍数.

    您的较大图像的步幅为8244,有效(8244/4 = 2061),但您的较小图像的步幅为4122,而不是(4122/4 = 1030.5).

    正如它在MSDN上所说的stride参数(我强调):

    整数,指定一条扫描线的开头与下一条扫描线之间的字节偏移量.这通常(但不是必须)像素格式中的字节数(例如,每像素16位的2)乘以位图的宽度.传递给此参数的值必须是四的倍数.

    假设你的步伐是正确的,我认为你唯一的选择是逐行复制它.所以,像:

      很棒Gdiplus::Bitmap的所需大小和格式

      使用LockBits获取位图像素数据.

      一次复制一行OpenCV图像.

      调用UnlockBits以释放位图数据.

    2023-02-08 14:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有