求使用CreateDIBSection显示8位灰度图的例子(不用那种多通道转单通道)

dfdddddddddddd dfdddddddddddd 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在做一个视频画面显示的程序, 摄像头采集接口只提供8位灰度缓冲, 而这也恰是我需要的.

我需要将采集来的灰度图做一些识别之类的图像处理, 这些处理操作被限制在20ms左右内完成, 我还需要显示采集的画面, 显然显示工作所用的时间也被限制得很短, 所以显示不应该进行转换什么的操作(如将8位源buf转为24位或32位buf后再显示)

目前的显示方案是用了windows sdk 7.1 里的一个示例改写的, 示例的路径在"\7_1\Samples\multimedia\wic\wicviewergdi"

该方案令人满意, 经我改写后的表现很好, 显示1920x1200, 32位的画面, 仅耗时1ms内, CPU使用率保持在0%~2%(在一般的双核PC)

但这与最终目的差了一步,

我只需要显示8位的灰度画面, 而不需要32位的, 如果将8位的源buf转为32位的话, CPU使用率和耗时都会飙升, 这是不期望的.

在这个示例里有用到CreateDIBSection, 但只有展示32位图片的用法, 我改写成8位的完全没效果, 显示的画面仍然是彩色的, 我想这应该是像素格式不匹配造成的

以下是我的尝试


BITMAPINFO *pBminfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
ZeroMemory(pBminfo, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
pBminfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBminfo->bmiHeader.biWidth = width;
pBminfo->bmiHeader.biHeight = -(LONG)height;
pBminfo->bmiHeader.biPlanes = 1;
pBminfo->bmiHeader.biBitCount = 8;
pBminfo->bmiHeader.biCompression = BI_RGB;

// Get a DC for the full screen
HDC hdcScreen = GetDC(NULL);

hr = hdcScreen ? S_OK : E_FAIL;

// Release the previously allocated bitmap
if (SUCCEEDED(hr))
{
if (m_hDIBBitmap)
{
DeleteObject(m_hDIBBitmap);
}

UINT colorCount;
hr = pPalette->GetColorCount(&colorCount);
WICColor myColor[256];
UINT actualPaletteSize;
hr = pPalette->GetColors(256, myColor, &actualPaletteSize);
memcpy(&pBminfo->bmiColors, myColor, 256*sizeof(RGBQUAD));
m_hDIBBitmap = CreateDIBSection(hdcScreen, pBminfo, DIB_PAL_COLORS, &pvImageBits,
NULL, 0);
colorCount = SetDIBColorTable(hdcScreen, 0, 256, (RGBQUAD*)myColor);//returns 0, failed
RGBQUAD q[256];
colorCount = GetDIBColorTable(hdcScreen, 0, 256, q);//returns 0 , failed

ReleaseDC(NULL, hdcScreen);
hr = m_hDIBBitmap ? S_OK : E_FAIL;
}
//result:
colorCount == 0 //GetDIBColorTable() failed
m_hDIBBitmap != NULL// "myColor" contains 8 bits gray scale color table, that is it


为什么 SetDIBColorTable和GetDIBColorTable都失败了?
BITMAP这么填错在哪了? 颜色表起作用了没?
...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
dfdddddddddddd
界面 15,976 成员 115,866 内容