2011-12-28 40 views
3

GetDIBits関数を使用してビットマップのピクセルを取得しようとしています。私はWindows GDI/APIを研究していないので、最初の議論であるHDCについては確信がありません。私はSOとWeb上で無数の投稿を検索しましたが、この特定のケースでHDCを初期化する方法に関する情報や例を見つけることができませんでした。ここで私は、画素値を読んで行ってきたどのくらいです:Windows GetDIBits関数を使用してビットマップピクセル値を取得する

HBITMAP hBitmap = (HBITMAP) LoadImage(0, L"C:/tmp/Foo.bmp" ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    // check hBitmap for error 

    BITMAP bm; 
    ::GetObject(hBitmap , sizeof(bm) , &bm); 

    // TODO: GetDIBits() 


ソリューション:いくつかは、より多くの私は次のことを一緒に考え出すことができましたウェブを精練した後

/* Omitting error checks for brevity */ 
    HDC dcBitmap = CreateCompatibleDC (NULL); 
    SelectObject(dcBitmap, hBitmap); 

    BITMAPINFO bmpInfo; 
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    bmpInfo.bmiHeader.biWidth = bm.bmWidth; 
    bmpInfo.bmiHeader.biHeight = -bm.bmHeight; 
    bmpInfo.bmiHeader.biPlanes = 1; 
    bmpInfo.bmiHeader.biBitCount = 24; 
    bmpInfo.bmiHeader.biCompression = BI_RGB;   
    bmpInfo.bmiHeader.biSizeImage = 0;   

    COLORREF* pixel = new COLORREF [ bm.bmWidth * bm.bmHeight ]; 
    GetDIBits(dcBitmap , hBitmap , 0 , bm.bmHeight , pixel , &bmpInfo , DIB_RGB_COLORS); 
+0

私は質問が何であるか分かりません。最初のパラメータ( 'hdc')は*デバイスコンテキスト*です。 ['GetDC'関数(http://msdn.microsoft.com/en-us/library/dd144871.aspx)を呼び出すか、ホストを実行するときに' WM_PAINT'イベントを処理するときにそれらのうちの1つを取得します他のGDI関連の活動の関数はそれらのいずれかをとります。 –

+0

これは、ビットマップで何をしたいかによって異なります。それでも、パレタイズされたビットマップやビデオアダプタモードは、前世紀にしか重要ではありませんでした。 GetDesktopWindow + GetWindowDCは、独自のウィンドウを持たない場合でもうまく動作します。代わりに、GDI +とBitmap :: LockBits()を検討してください。 –

+0

@CodyGray私はイベントを処理していませんし、ウィンドウも持っていません。私はコンソールアプリケーションを作成しています。ファイルを開いてピクセル値を読みたいだけです。私はHDCを使用するのを犠牲にしており、私は推測したくありません。 – Olumide

答えて

1

ソースビットマップは、通常、デバイス依存のビットマップです。これはあまり一般的ではありませんが、ビットマップのピクセル値がインデックスとしてカラーテーブルに格納されることを意味します。そのような場合、GetDIBitsは、デバイスコンテキストに格納されているカラーテーブルにアクセスする必要があります。

ビットマップでインデックスの代わりにRGB値を使用している場合は、私の経験では有効なものを提供する必要がありますが(What is the HDC for in GetDIBits?を参照)、デバイスコンテキストの他の側面色の深さ

1

ピクセルカラー値を取得すること、またはGetDIBitsを呼び出すことはあなたの目標ですか?ピクセルコンテンツのみを使用する場合はGetObjectを使用して、HBITMAPハンドルに対応するBITMAP構造体を取得すると、その構造体のbmBitsポインタがピクセルにアクセスできます(ビットマップの元の形式になります。 24bppなので、構造体の他のフィールドをチェックして形式が何であるかを確認してください)。

関連する問題