2016-06-20 7 views
0

クリップボードからビットマップデータを取得しようとしています。私は成功し、ヘッダからの情報を記録することができクリップボードから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! 
      } 
     } 
    } 
    //... 

:私は正常にCF_DIBV5オブジェクトのヘッダー情報を取得することができます。今実際のHBITMAPを入力してGetDIBitsに渡すことができます。ドキュメントでは、CF_DIBV5BITMAPV5HEADERで、その後にビットマップ色空間情報とビットマップビットが続きます。

私は皮肉なことに、最後の部分はわかりにくいので混乱してしまいます。私はビットマップビットに到達すると仮定、私はヘッダーのサイズとヘッダスペースに "色空間情報"を追加する必要があります。だから、

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

私は

どのように私は、この神秘的な色空間情報の大きさを知ることができます...と思いますか?そして、上記の表現が真実であるように、文字通り "ビットマップビット"はHBITMAPですか?

私はCの初心者ですので、私は明らかに見落としているかもしれません。

更新:私は今試して、私はDIBを持っているのに対しHBITMAPは、DDBであるいくつかのドキュメントを再読み込みから実現。だから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; 
関連する問題