2009-07-08 48 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位藍色,如上所述。