我在32位扫描仪的缓冲区(类型 - 长)中有一个图像数据。
例如,buffer [0]的对应像素值为952,即[184,3,0,0]< - [R,G,B,A];
我想在屏幕上显示/绘制/绘制;当我试图阅读有关重置位图时,我很困惑。我看了win32函数,CBitmap类,windows窗体(图片框)等我很难理解将这个缓冲区数据显示到应用程序窗口的一般想法/ appraoch。
我构建了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位图像?
由于
拉吉
已编辑尝试实施DAVE的方法,可能会对我的实施提出一些评论。我无法继续使用bitbl,因为我没有两个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);
}
答案 0 :(得分:1)
如果您只是想在屏幕上绘制它的另一种选择是使用TinyPTC(http://sourceforge.net/projects/tinyptc/files/)。它只是3个函数,如果你只想绘制一些像素,那就非常简单。
编辑:似乎http://www.pixeltoaster.com是TinyPTC的延续,可能是优先考虑的。
答案 1 :(得分:1)
如果您已将图像的字节放在缓冲区中,则可以使用:
CBitmap对象(MFC)和方法CBitmap::CreateBitmapIndirect
或
win32例程CreateBitmapIndirect。
现在您可以使用BitBlt在DC上绘制它。要获得一个窗口DC,请使用GetDC。
无需为32位图像创建托盘。
答案 2 :(得分:0)
这是您可能想要的策略:
创建一个与扫描数据大小相同的位图,格式相同(使用CreateDIBSection)。
使用GetDIBits获取像素数据的基址。
将数据(从扫描仪)复制到地址GetDIBits返回。
现在渲染你的位图! (使用BitBlt,或某些)。
关于调色板 - 32位图像通常没有明确的调色板 - 调色板中需要1670万(假设8位alpha)值。一般来说,调色板假定为8位红色,8位绿色,8位蓝色,如上所述。
答案 3 :(得分:0)
以下是您可以尝试的简化方法,分解为步骤:
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_PAINT处理程序:
如果您没有看到结果,请尝试循环遍历vImageBuff并将每个像素设置为RGB(255,0,0)或类似的东西,只需要理智地检查逻辑的其余部分。
如果没有绘图,请确保每个像素的alpha分量为255。
如果你得到一个乱码图像,那么你需要仔细检查像素格式,步幅等。