gpt4 book ai didi

c++ - MFC - 如何绘制彩色位图到对话框DC

转载 作者:太空宇宙 更新时间:2023-11-03 22:57:21 31 4
gpt4 key购买 nike

我在相机采集循环中得到了这段代码:

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 位图 blit 到屏幕的正确方法是什么?

最佳答案

是的,你是对的——默认是单色的。我认为最简单的(对于 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)和正确的垂直线序列(即上->下 vs 下->上),您可以通过将 biHeight 设置为正数来调整它/负值。

关于c++ - MFC - 如何绘制彩色位图到对话框DC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811976/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com