求使用CreateDIBSection显示8位灰度图的例子(不用那种多通道转单通道)
我在做一个视频画面显示的程序, 摄像头采集接口只提供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位的完全没效果, 显示的画面仍然是彩色的, 我想这应该是像素格式不匹配造成的
以下是我的尝试
为什么 SetDIBColorTable和GetDIBColorTable都失败了?
BITMAP这么填错在哪了? 颜色表起作用了没?
我需要将采集来的灰度图做一些识别之类的图像处理, 这些处理操作被限制在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这么填错在哪了? 颜色表起作用了没?
...全文
相关推荐
24位bmp位图转灰度图(MFC实现)
实现位图的读取显示保存,是一个典型的图像处理基础程序
基于VC6.0的24位BMP图像显示实现
BMP(Bitmap)是一种广泛使用的位图图像格式,因其结构简单、易于解析而在图像处理领域占据重要地位。BMP文件通常由三个主要部分组成:文件头(BITMAPFILEHEADER)信息头(DIB头,BITMAPINFOHEADER)以及像素数据(Pixel Data)。文件头(BITMAPFILEHEADER):包含文件的基本信息,如文件类型、文件大小、数据偏移量等。DIB头(BITMAPINFOHEADER):详细描述图像的尺寸、颜色格式、压缩方式等。
256色转灰度图_Vc_
VC++图像处理256色转灰度图源代码,效果非常好。
打开 图像 并完成灰度图
打开 图像 并完成灰度图 功能 在vc Doc 类里写入处理函数,view 显示
vc 生成灰度位图 黑白图 加载位图
根据0或者1数组直接画黑白图 用createDIBSection生成灰度图


界面
