Windows设备相关与设备无关位图解析 https://www.cnblogs.com/luofeiju/p/15839811.html
两个都可以通过位图句柄获得位图的信息部分,但是GetBitmapBits获取的位图信息换到一些设备中,就可能不能正常显示了,而GetDIBits获取的位图信息,即使换个设备,也一样可以正常显示,因为DIB有个调色板,所以可以创建16色和256色可以兼容低端显示设备
LONG GetBitmapBits(
[in] HBITMAP hbit,
[in] LONG cb,
[out] LPVOID lpvBits
);
通过观察函数的参数(位图句柄,拷贝字节数,拷贝到的目标内存地址),就能看出来GetBitmapBits就是只获取位图的数据部分,不会获取位图其他信息,第二个参数拷贝自己数需要我们自己去计算,可以通过GetObject(位图句柄,sizeof(BITMAP), 目标位图结构地址);这个API得到位图相关信息,通过里面的信息,就能得到cb的大小值是多少
int GetDIBits(
[in] HDC hdc,
[in] HBITMAP hbm,
[in] UINT start,
[in] UINT cLines,
[out] LPVOID lpvBits,
[in, out] LPBITMAPINFO lpbmi,
[in] UINT usage
);
GetDIBits(设备DC,位图句柄,起始行数,要copy的行数,接收位图数据的缓冲区的指针,指向 BITMAPINFO 结构的指针,DIB_PAL_COLORS或DIB_RGB_COLORS) ,这个函数不止copy了位图的数据部分,还copy了位图的头信息部分以及调色板,得到的是DIB位图,因为是DIB(Device Independent Bitmap)位图,,所以调色板是必不可少的,有了调色板这样这个位图才能在低端设备中都能正常显示,这个函数使用时,需要调用两次,第一次当传入的lpvBits参数为NULL时,会将位图信息头写入到lpbmi中,然后第二次调用时,会根据lpbmi中的信息分配内存大小,然后将数据拷贝到lpvBits中