0

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 を選択しませんでした。他に何が問題になる可能性がありますか?

4

3 に答える 3

0

MSFT ドキュメントには、「アプリケーションがこの関数を呼び出すときに、hbmp パラメーターで識別されるビットマップをデバイス コンテキストに選択してはなりません」と記載されています。( http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29.aspx )。
それが問題の一部である可能性があります。

DeleteObjectまた、DC に選択されたままのビットマップを呼び出すべきではないことにも注意してください。

于 2013-05-15T16:00:51.723 に答える
0

必要な行は 1 行だけですが、BITMAPINFO 構造体で高さ全体を設定する必要があります。

bmi.bmiHeader.biHeight=768;
于 2013-10-30T12:42:05.913 に答える