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);
私は質問が何であるか分かりません。最初のパラメータ( 'hdc')は*デバイスコンテキスト*です。 ['GetDC'関数(http://msdn.microsoft.com/en-us/library/dd144871.aspx)を呼び出すか、ホストを実行するときに' WM_PAINT'イベントを処理するときにそれらのうちの1つを取得します他のGDI関連の活動の関数はそれらのいずれかをとります。 –
これは、ビットマップで何をしたいかによって異なります。それでも、パレタイズされたビットマップやビデオアダプタモードは、前世紀にしか重要ではありませんでした。 GetDesktopWindow + GetWindowDCは、独自のウィンドウを持たない場合でもうまく動作します。代わりに、GDI +とBitmap :: LockBits()を検討してください。 –
@CodyGray私はイベントを処理していませんし、ウィンドウも持っていません。私はコンソールアプリケーションを作成しています。ファイルを開いてピクセル値を読みたいだけです。私はHDCを使用するのを犠牲にしており、私は推測したくありません。 – Olumide