【问题标题】:MFC - How to draw a color bitmap to the dialog DCMFC - 如何将彩色位图绘制到对话框 DC
【发布时间】:2014-11-07 23:49:14
【问题描述】:

我在相机采集循环中有这段代码:

CBitmap* bmp = new CBitmap();
CDC* pDC;
CBitmap* old;
CDC*  memDC = new CDC();

pDC = pLiveImageDlg->GetDC();

bmp->CreateCompatibleBitmap(pDC, 640, 480);

memDC->CreateCompatibleDC(pDC);
old = memDC->SelectObject(bmp);

bmp->SetBitmapBits(640 * 480 * 3, frame.data);

pDC->BitBlt(0, 0, 640, 480, memDC, 0, 0, SRCCOPY);

memDC->SelectObject(old);

我的问题是,在查看绘制到对话框上的位图时,它看起来完全扭曲且单色。通常,图像失真意味着像素索引已关闭(颜色格式错误等)。 “frame”变量是一个 OpenCV Mat 对象,它以 24 位 RGB 格式抓取图像(使用imshow() 显示颜色非常好)。我觉得单色问题与 CreateCompatibleDC 函数调用有关,因为根据 MSDN 文档,默认情况下它会创建一个 1x1 单色像素......而且这个单色问题可能导致“像素字节数组偏移”问题.

将位图以 24 位 RGB 位图的形式显示在屏幕上的正确方法是什么?

【问题讨论】:

  • 没有理由做new CBitmap()new CDC(),除非对象的生命周期超过了它们被实例化的函数。
  • 不要直接绘制到对话框的 DC。在对话框中放置一个控件,并让控件显示位图。
  • 图像宽度应为 % 4。所以:640 可以 / 641,642,643 否 / 644 可以 / 依此类推...

标签: c++ opencv visual-c++ bitmap mfc


【解决方案1】:

是的,你是对的 - 默认是单色的。 我认为最简单(对 GDI 来说也是最快的)就是直接渲染 24 位图:

BITMAPINFO bmi = { 0 };
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 640;
bmi.bmiHeader.biHeight = -480;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;

CClientDC dc(pLiveImageDlg);
SetDIBitsToDevice(dc, 0, 0, 640, 480, 0, 0, 0, 480, data, frame.data, 0);

这里要提到两件事,应该有正确的 RGB 序列(即 RGB/BGR)和正确的垂直线序列(即 up->down vs down->up),您可以通过将 biHeight 设置为正数来调整它/负值。

【讨论】:

  • 嗨。这非常有用,谢谢。你的意思可能是SetDIBitsToDevice(dc, 0, 0, 640, 480, 0, 0, 0, 480, frame.data, &bmi, 0);
【解决方案2】:

如果你想显示一个灰度位图你必须准备一个调色板到 BITMAPINFO

int bpp = 8 * img.elemSize();
uchar buffer[sizeof(BITMAPINFO) + 256*4];
BITMAPINFO* bmi = (BITMAPINFO*)buffer;
BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);

//Sets the palette only if image is grey scale
if (bpp == 8)
{
    RGBQUAD* palette = bmi->bmiColors;
    for (int i = 0; i < 256; i++)
    {
      palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
      palette[i].rgbReserved = 0;
    }
}

更多详情请看这里:How to display an OpenCV image or video in your own MFC interface

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多