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++ 新手,几乎不知道如何使用这个函数。对于所有大于或等于 0 且小于或等于 3*1366 的 i,我期望 p[i] 为 255,因为 gBit 的每个像素都是白色的,但正在显示随机值,其中大部分为 0。我没有正确使用此功能还是其他地方的错误?

编辑:GetDIBits() 似乎无法将像素数据保存在 p 中,因为当我删除包含 GetDIBits() 的行时会返回相同的值。这次我没有选择 hBit 进入 DC。还有什么问题?

4

3 回答 3

0

即使您只想要一行,您仍然需要在 BITMAPINFO 结构中设置全高:

bmi.bmiHeader.biHeight=768;
于 2013-10-30T12:42:05.913 回答
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

尝试将您的 BitBlt 函数第三个参数更改为 0(我不太确定为什么它是 500,因为您的位图仅包含一个扫描线)。

另请注意,由于 24 位位图是 DWORD 对齐的(最后未使用的字节用 0 填充)每个扫描线消耗四个字节的倍数,因此您的文件大小实际上不是 1366*3,而是 1368*3。

于 2013-09-23T22:49:05.267 回答