2009-07-08 49 views
0

我有一个图像数据在一个缓冲区(类型 - 长)从32位扫描仪。例如,缓冲器[0]的对应像素值是952,其是[184,3,0,0] <- [R,G,B,A]; [0124]显示32位位图 - 调色板

我想要在屏幕上显示/绘制/绘制;当我试图阅读关于显示位图时,我感到困惑。我看了win32函数,CBitmap类,窗体(图片框)等等,我很难理解在应用程序窗口上显示缓冲区数据的一般想法/方法。

我已经构建了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函数,窗体,MFC等;

3.我也明白,BitBlt,createDIBSection,OnPaint等正在使用?我很困惑这些各种功能和编码平台?请给我一个简单的方法。

4.如何创建一个调色板来显示32位图像?

感谢

拉吉
EDITED试图实现DAVE的做法,有人可以有人评论我IMPLEMTATION。我无法继续下去,因为我没有两个HDC,我不知道如何获得这个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

Windows将需要BGRA,而不是RGBA,不是吗? – 2009-07-08 23:45:36

+0

嗨Ubben我的理解是像素将在内存中表示为BGRA。 – Raj 2009-07-09 01:30:16

+0

Windows倾向于在小端进行操作,这就是为什么它存储为BGRA而不是ARGB – 2013-06-05 14:52:34

回答

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. 从兼容的HDC调用BitBlt(...,SRCCOPY)到窗口的HDC。其他参数应该是显而易见的。起初不要试图拉伸或做任何事情。
  3. 请记住在破坏之前将原始虚拟位图选择到临时HDC中。

如果您没有看到结果,请尝试通过vImageBuff循环,并将每个像素设置为RGB(255,0,0)或类似的东西,只是为了理智检查逻辑的其余部分。

如果不拉确保每个像素的阿尔法分量为255

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

0

这里是你可能会喜欢的策略:

与同尺寸的扫描数据,并且相同的格式(使用CreateDIBSection)创建位图。

使用GetDIBits获取像素数据的基地址。

将您的数据(从扫描仪)复制到GetDIBits返回的地址。

现在渲染你的位图! (使用BitBlt或其他)。

关于调色板 - 32位图像通常没有明确的调色板 - 在调色板中需要1670万(假设8位alpha)值。一般来说,调色板被假定为8位红色,8位绿色,8位蓝色,如上所述。