使用GetDIBits()时出现问题

时间:2013-05-15 15:04:32

标签: c++ gdi getdibits

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

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

3 个答案:

答案 0 :(得分:0)

MSFT文档声明:“当应用程序调用此函数时,不得将hbmp参数标识的位图选择到设备上下文中。” (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29.aspx)。
这可能是问题的一部分。

另请注意,您不应在仍选择加入DC的位图上调用DeleteObject

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

bmi.bmiHeader.biHeight=768;