使用GetDIBits()时出现问题
Trouble using 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++新手,几乎不知道如何使用这个函数。对于所有大于或等于0且小于或等于3*1366的I,我期望p[I]为255,因为gBit的每个像素都是白色的,但是显示的是随机值,其中大多数是0。我没有正确使用这个函数,还是在其他地方出错?
编辑:似乎GetDIBits()未能将像素数据保存在p中,因为当我删除包含GetDIBits()的行时返回相同的值。我这次没有选择hBit进入DC。还有什么问题呢?
MSFT文档声明:"当应用程序调用此函数时,由hbmp参数标识的位图不能被选择到设备上下文中。"(http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29.aspx)。
这可能是问题的一部分。
还要注意的是,您不应该在仍然选择到DC的位图上调用DeleteObject
。
尝试将BitBlt函数的第三个参数更改为0(我不太确定为什么它是500,因为您的位图仅包含一条扫描线)。
还请注意,由于24位图是DWORD对齐的(最后未使用的字节填充为0),每个扫描线消耗4个字节的倍数,因此您的文件大小实际上不是1366*3,而是1368*3。
即使你只想要一行,你仍然需要在BITMAPINFO结构中设置完整的高度:
bmi.bmiHeader.biHeight=768;
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用GetDIBits()时出现问题