2013-12-23 12 views
2

我有这样的代码,一个OpenCV的图像转换为位图:转换OpenCV的图像GDI的位图不起作用取决于图像大小

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个字节,然后使用它转换为位图。

所有学分到罗杰罗兰德他的答案。

+0

+1这是一个有效的解决方法。 –

回答

6

我认为问题是,BMP格式必须有一个箭步是4

你的放大图像的倍数为8244一大步,这是有效的(4分之8244= 2061),但你的小图像的步幅为4122,不是(4122/4 = 1030.5)。

至于it says on MSDN步幅参数(我的重点):

的整数,指定字节一个 扫描线和未来的开始之间的偏移。这通常(但不一定)是像素格式的字节数(例如,每个 像素有16位的2)乘以位图的宽度。传递给此 参数的值必须是四个的倍数

假设你的步伐是正确的,我认为你只是选择是逐行复制它。所以,像这样:

  1. 大一个所需要的尺寸和格式
  2. 使用LockBits得到位图像素数据的Gdiplus::Bitmap
  3. 将OpenCV图像一次一行地复制。
  4. 调用UnlockBits来释放位图数据。
+0

谢谢。有什么方法可以解决它吗? – mans

+0

@mans我给我的答案增加了一些。 –

+1

谢谢。这非常有用。你可以请张贴一些代码吗? – mans