GetDIBits() を使用する次のコードでは、目的の出力が得られません。
#include <windows.h>
#include <iostream>
using namespace std;
int main() {int i; HDC MemDC=CreateCompatibleDC(NULL);
HBITMAP hBit=(HBITMAP)LoadImage(NULL,(LPCTSTR)"F:\\gBit.bmp",IMAGE_BITMAP,1366,768,LR_CREATEDIBSECTION);
SelectObject(MemDC,hBit);
BITMAPINFO bmi;
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth=1366;
bmi.bmiHeader.biHeight=1;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=24;
bmi.bmiHeader.biCompression=BI_RGB;
bmi.bmiHeader.biSizeImage=0;
bmi.bmiHeader.biXPelsPerMeter=0;
bmi.bmiHeader.biYPelsPerMeter=0;
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;
BYTE p[3*1366];
GetDIBits(MemDC,hBit,500,1,p,&bmi,DIB_RGB_COLORS); //My screen width is 1366 and I want to get the pixels of the 500th line
for (i=0; i<3*1366; i+=3) {cout<<p[i]<<endl;}
DeleteObject(hBit);
ReleaseDC(NULL,MemDC); DeleteDC(MemDC);
}
(gBit.bmp は、全体が白の 1366x768 ビットマップです。)
私は C++ が初めてで、この関数の使い方がほとんどわかりません。gBit のすべてのピクセルが白であるため、0 以上 3*1366 以下のすべての i に対して p[i] が 255 になることを期待していましたが、ランダムな値が表示されており、そのほとんどが 0 です。この機能を適切に使用していないのでしょうか、それともどこかで間違っていますか?
編集: GetDIBits() を含む行を削除すると同じ値が返されるため、GetDIBits() がピクセル データを p に保存できないようです。今回は DC に hBit を選択しませんでした。他に何が問題になる可能性がありますか?