使用Windows GetDIBits函数获取位图像素值

时间:2011-12-28 14:31:11

标签: winapi bitmap gdi hbitmap getdibits

我试图使用GetDIBits函数获取位图的像素。由于我没有研究过Windows GDI / API,我对第一个参数HDC非常不确定。我已在SO和网络上搜索了无数帖子,但在这种特定情况下无法找到有关如何初始化HDC的信息或示例。这是我读取像素值的程度:

    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 );

2 个答案:

答案 0 :(得分:1)

源位图通常是依赖于设备的位图。虽然现在不太常见,但这可能意味着位图的像素值作为索引存储到颜色表中。在这些情况下,GetDIBits需要访问颜色表,颜色表存储在设备上下文中。

如果您的位图使用RGB值而不是索引,那么设备上下文应该是无关紧要的,但根据我的经验,您仍然必须提供有效的(请参阅What is the HDC for in GetDIBits?),也许它会查看设备的其他方面上下文,就像颜色深度一样。

答案 1 :(得分:1)

您的目标是获取像素颜色值,还是调用GetDIBits?如果您只想要像素内容,可以使用GetObject获取与BITMAP句柄对应的HBITMAP结构,该结构中的bmBits指针可以访问像素(注意:它将采用位图的原始格式,可能不是24bpp,因此请检查结构的其他字段以查看格式是什么)。