3

GetDIBits 関数を使用してビットマップのピクセルを取得しようとしています。私は Windows GDI/API について勉強したことがないので、最初の引数である HDC についてはよくわかりません。SO と Web で無数の投稿を検索しましたが、この特定のケースで HDC を初期化する方法に関する情報や例を見つけることができませんでした。ピクセル値をどこまで読んだかは次のとおりです。

    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 );
4

2 に答える 2

1

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

ビットマップがインデックスの代わりに RGB 値を使用している場合、デバイス コンテキストは無関係であるはずですが、私の経験では有効なものを提供する必要があります ( GetDIBits の HDC とは何ですか? を参照)。おそらく、デバイスの他の側面を調べます。色深度などのコンテキスト。

于 2011-12-28T17:10:47.840 に答える
1

あなたの目標は、ピクセルの色の値を取得することですか、それとも呼び出すことGetDIBitsですか? ピクセル コンテンツだけが必要な場合は、ハンドルに対応する構造体GetObjectを取得するために使用できます。その構造体のポインターは、ピクセルへのアクセスを提供します (注: ビットマップの元の形式であり、24bpp ではない可能性があるため、確認してください構造体の他のフィールドを調べて、形式を確認してください)。BITMAPHBITMAPbmBits

于 2011-12-28T17:20:30.953 に答える