2016-06-20 151 views
0

我試圖從剪貼板獲取位圖數據。我能順利拿到了CF_DIBV5對象的標頭信息:從剪貼板獲取CF_DIBV5的位圖

BOOLEAN exists = IsClipboardFormatAvailable(CF_DIBV5) && 
     OpenClipboard(session->windowHandle); 

    if (exists) { 
     HGLOBAL clipboard = GetClipboardData(CF_DIBV5); 
     exists = clipboard != NULL; 
     if (exists) { 
      LPTSTR lptstr = GlobalLock(clipboard); 
      exists = lptstr != NULL; 
      if (exists) { 
       BITMAPV5HEADER * header = clipboard; 
       //now need the HBITMAP! 
      } 
     } 
    } 
    //... 

我可以成功登錄從報頭信息。現在我想要實際的HBITMAP,所以我可以將它傳遞到GetDIBits。文檔說CF_DIBV5是一個BITMAPV5HEADER「後跟位圖顏色空間信息和位圖位」。

最後一部分讓我很尷尬,因爲它很簡單。我假設去位圖位,我需要添加頭的大小和「色彩空間信息」到頭指針。所以

HBITMAP bitmap = header + sizeof(BITMAPV5HEADER) + /* ???? */; 

我想......

我怎麼能知道這神祕的色彩空間信息的大小? 「位圖位」字面上是一個HBITMAP,因此上述表達式是正確的?

由於我是C新手,我可能會忽略這個明顯的問題。

更新:我現在通過試驗和重讀一些文檔認識到HBITMAP是一個DDB,而我有一個DIB。所以GetDIBits對我來說不是正確的功能。可以使用什麼函數將任何DIB轉換爲不壓縮的格式?

回答

1

以下是如何獲取適當的位圖位指針。內容的排列取決於標題中描述的壓縮類型和位數。

HGLOBAL clipboard = GetClipboardData(CF_DIBV5); 
BITMAPV5HEADER* bitmapV5Header = (BITMAPV5HEADER*)GlobalLock(clipboard); 
int offset = bitmapV5Header->bV5Size + bitmapV5Header->bV5ClrUsed * sizeof(RGBQUAD); 
if (bitmapV5Header->bV5Compression == BI_BITFIELDS) 
    offset += 12; //bit masks follow the header 
BYTE *bits = (BYTE*)bitmapV5Header + offset;