【发布时间】:2010-11-09 05:14:11
【问题描述】:
我在 32 位扫描仪的缓冲区(类型 - 长)中有一个图像数据。
例如buffer[0]对应的像素值为952,即[184,3,0,0]
我想在屏幕上显示/绘画/绘图;当我尝试阅读有关显示位图的信息时,我感到很困惑。我查看了 win32 函数、CBitmap 类、Windows 窗体(图片框)等。我很难理解在应用程序窗口上显示此缓冲区数据的一般想法/方法。
我已经构建了 BITMAPFILEHEADER 和 BITMAPINFOHEADER;在缓冲区中有像素数据,(unsigned char *)vInBuff,大小为vImageSz;
//construct the BMP file Header
vBmfh.bfType = 19778;
vBmfh.bfSize = 54+vImageSz;//size of the whole image
vBmfh.bfReserved2 = 0;
vBmfh.bfReserved1 = 0;
vBmfh.bfOffBits = 54;//offset from where the pixel data can be found
//Construct the BMP info header
vBmih.biSize = 40;//size of header from this point
vBmih.biWidth = 1004;
vBmih.biHeight = 1002;
vBmih.biPlanes = 1;
vBmih.biCompression = BI_RGB;
vBmih.biSizeImage = vBmih.biWidth*vBmih.biHeight*4;
vBmih.biBitCount = 32;
vBmih.biClrUsed = 0;
vBmih.biClrUsed = 0;
1.接下来我应该做什么来显示这个?
2 我应该使用什么来显示 32 位位图?我看到人们使用 createwindows 函数、windows 窗体、MFC 等;
3.我也知道BitBlt,createDIBSection,OnPaint等正在被使用?我对这些各种功能和编码平台感到困惑?请建议我一个简单的方法。
4.如何创建调色板来显示 32 位图像?
谢谢
Raj
已编辑 尝试实施 DAVE 的方法,有人可以评论我的实施。我无法继续使用 bitblt,因为我没有两个 HDC,我不知道如何获得这个?请帮忙
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);
}
【问题讨论】:
-
Windows 需要 BGRA,而不是 RGBA,不是吗?
-
嗨 Ubben 我的理解是像素将在内存中表示为 BGRA。
-
Windows 倾向于使用小端序,这就是它存储为 BGRA 而不是 ARGB 的原因