显示32位位图 - 调色板

时间:2009-07-08 23:09:48

标签: c++ windows image bitmap

我在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);

}

4 个答案:

答案 0 :(得分:1)

如果您只是想在屏幕上绘制它的另一种选择是使用TinyPTC(http://sourceforge.net/projects/tinyptc/files/)。它只是3个函数,如果你只想绘制一些像素,那就非常简单。

编辑:似乎http://www.pixeltoaster.com是TinyPTC的延续,可能是优先考虑的。

答案 1 :(得分:1)

如果您已将图像的字节放在缓冲区中,则可以使用:

CBitmap对象(MFC)和方法CBitmap::CreateBitmapIndirect

win32例程CreateBitmapIndirect

现在您可以使用BitBltDC上绘制它。要获得一个窗口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处理程序:

  1. 将hBitmap选择为临时兼容的HDC
  2. 将BitBlt(...,SRCCOPY)从兼容的HDC调用到窗口的HDC。其他参数应该是显而易见的。不要试图伸展或做任何花哨的事情。
  3. 记住在销毁之前选择原始的虚拟位图进入临时HDC。
  4. 如果您没有看到结果,请尝试循环遍历vImageBuff并将每个像素设置为RGB(255,0,0)或类似的东西,只需要理智地检查逻辑的其余部分。

    如果没有绘图,请确保每个像素的alpha分量为255。

    如果你得到一个乱码图像,那么你需要仔细检查像素格式,步幅等。