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

dfdddddddddddd 2014-07-20 11:40:40
我在做一个视频画面显示的程序, 摄像头采集接口只提供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这么填错在哪了? 颜色表起作用了没?
...全文
295 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfdddddddddddd 2014-07-23
  • 打赏
  • 举报
回复
引用 2 楼 Idle_ 的回复:
SetDIBColorTable(), 顾名思义,是设置DIB图片的,前提条件,hDC中关联的bitmap是DIB。但是你调用的hdcScreen却取自GetDC(0), 里面存的可是DDB哦,调用SetDIBColorTable, GetDIBColorTable当然会失败。 你应当CreateCompatibleDC创建一个memDC,然后SelectObject将你创建的DIB联入这个memDC中再调用SetDIBTable, GetDIBTable. 然后BitBlt将你的memDC复制进hdcScreen中
改这个没用, 按你说的试过了. 最后也不知道怎么解决的, 代码和上周的差不多, 没怎么改动, 一F5就有效果了
阿呆_ 2014-07-21
  • 打赏
  • 举报
回复
SetDIBColorTable(), 顾名思义,是设置DIB图片的,前提条件,hDC中关联的bitmap是DIB。但是你调用的hdcScreen却取自GetDC(0), 里面存的可是DDB哦,调用SetDIBColorTable, GetDIBColorTable当然会失败。 你应当CreateCompatibleDC创建一个memDC,然后SelectObject将你创建的DIB联入这个memDC中再调用SetDIBTable, GetDIBTable. 然后BitBlt将你的memDC复制进hdcScreen中
gfm688 2014-07-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/cometnet/article/details/6418181

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧