C++ 显示32位位图-调色板
我有一个32位扫描仪的缓冲区(长型)中的图像数据C++ 显示32位位图-调色板,c++,windows,image,bitmap,C++,Windows,Image,Bitmap,我有一个32位扫描仪的缓冲区(长型)中的图像数据 例如,缓冲区[0]对应的像素值为952,即[184,3,0,0]以下是您可能喜欢的策略: 创建与扫描数据大小相同、格式相同的位图(使用CreateDIBSection) 使用GetDIBits获取像素数据的基址 将数据(从扫描仪)复制到GetDIBits返回的地址 现在渲染位图!(使用BitBlt或类似的东西) 关于调色板-通常,32位图像没有显式调色板-调色板中需要1670万(假设8位alpha)值。通常,调色板假定为8位红色、8位绿色、8位蓝
例如,缓冲区[0]对应的像素值为952,即[184,3,0,0]以下是您可能喜欢的策略: 创建与扫描数据大小相同、格式相同的位图(使用CreateDIBSection) 使用GetDIBits获取像素数据的基址 将数据(从扫描仪)复制到GetDIBits返回的地址 现在渲染位图!(使用BitBlt或类似的东西)
关于调色板-通常,32位图像没有显式调色板-调色板中需要1670万(假设8位alpha)值。通常,调色板假定为8位红色、8位绿色、8位蓝色,如上所述。如果您只想在屏幕上打印,另一种选择是使用TinyPTC()。它只有3个函数,如果你只想绘制一些像素,它非常简单
编辑:似乎是TinyPTC的延续,可能是首选。如果缓冲区中已有图像字节,则可以使用:
一种CBitmap对象(MFC)及其实现方法
或
win32例程。
现在,您可以使用在一个平面上绘制它。要获得窗口DC,请使用
无需为32位图像创建托盘。这里有一种简化的方法,您可以尝试,分为以下步骤:
BITMAPINFO bitmapinfo = { 0 };
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biWidth = 1004;
bitmapinfo.bmiHeader.biHeight = -1002;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biCompression = BI_RGB;
HBITMAP hBitmap = CreateDIBSection(NULL,
&bitmapinfo,
DIB_RGB_COLORS,
(void **)&vImageBuff,
NULL,
0);
现在在vImageBuff上聚会,然后将hBitmap缓存到某个地方,以便在wndproc中,您可以在WM_绘制处理程序中:
如果你得到的是一幅乱码图像,那么你需要仔细检查像素格式、步幅等。Windows需要的是BGRA,而不是RGBA,不是吗?嗨,乌本,我的理解是,像素将在内存中表示为BGRA。Windows倾向于使用小尾端,这就是为什么它存储为BGRA而不是ARGBHello Dave,我已经用你的方法更新了我的帖子。我不能继续下去了,请你把你的帖子分成几个简单的步骤,这样我就可以跟上了。谢谢,您将在OnPaint函数中获得正确的DC进行绘制。您可以使窗口无效以强制OnPaint,或者按照Nick D的建议,使用GetDC。
DisplayDataToImageOnScreen(unsigned char* vInBuff, int vImageSz) // buffer with pixel data, Size of pixel data
{
unsigned char* vImageBuff = NULL;
HDC hdcMem=CreateCompatibleDC(NULL);
HBITMAP hBitmap = CreateDIBSection(hdcMem,
(BITMAPINFO*)&vBmih,
DIB_RGB_COLORS,
(void **)&vImageBuff,
NULL, 0);
GetDIBits(hdcMem,
hBitmap,
0,
1,
(void**)&vImageBuff,
(BITMAPINFO*)&vBmih,
DIB_RGB_COLORS);
memcpy(vImageBuff,vInBuff,vImageSz);
}
BITMAPINFO bitmapinfo = { 0 };
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biWidth = 1004;
bitmapinfo.bmiHeader.biHeight = -1002;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biCompression = BI_RGB;
HBITMAP hBitmap = CreateDIBSection(NULL,
&bitmapinfo,
DIB_RGB_COLORS,
(void **)&vImageBuff,
NULL,
0);