Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows位图和DIBSection之间有什么区别?_Windows_Bitmap_Dib - Fatal编程技术网

Windows位图和DIBSection之间有什么区别?

Windows位图和DIBSection之间有什么区别?,windows,bitmap,dib,Windows,Bitmap,Dib,我正在从包含以下内容的文件加载DIBSection: HBITMAP bmpIn = (HBITMAP) LoadImage(NULL, _T("c:\\Temp\\Temp.bmp"), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); 根据经验,我发现加载的位图和我过去使用的位图之间存在以下差异,但我找不到任何说明应该存在差异的文档 这些行在内存中的顺序是自上而下,而不是自下而上。我已经验证了.bmp文件本身是自下而上

我正在从包含以下内容的文件加载DIBSection:

HBITMAP bmpIn = (HBITMAP) LoadImage(NULL, _T("c:\\Temp\\Temp.bmp"), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
根据经验,我发现加载的位图和我过去使用的位图之间存在以下差异,但我找不到任何说明应该存在差异的文档

  • 这些行在内存中的顺序是自上而下,而不是自下而上。我已经验证了.bmp文件本身是自下而上排序的
  • 行填充是2字节的倍数,而不是4字节
我还发现,当您使用从头开始创建DIBSection时,有一个记录在案的差异

  • GetObject
    返回的DIBSECTION.dsHandle和BITMAP.bmBits值将为空
前两个差异的文档在哪里?我是否遗漏了什么?这是Windows7,但我无法想象其他版本的Windows会有什么不同

编辑:一些其他详细信息。这里是一个十六进制转储的
temp.bmp
;这是一个7x7的图像,右侧有白色条纹,左侧有蓝色值(0x10、0x20等)递增。您可以看到底线(00,00,70)是第一行,有3个字节的填充

00: 42 4d de 00 00 00 00 00 00 00 36 00 00 00 28 00
10: 00 00 07 00 00 00 07 00 00 00 01 00 18 00 00 00
20: 00 00 a8 00 00 00 00 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 00 00 70 00 00 00 00 00 00 00 00 00
40: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00 60 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: ff ff ff 00 00 00 50 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00 40 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: ff ff ff 00 00 00 30 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00 20 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: ff ff ff 00 00 00 10 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 ff ff ff 00 00 00
下面是一个读取.bmp文件并写出内容的示例程序。为了简洁起见,我删除了错误检查

int _tmain(int argc, _TCHAR* argv[])
{
   HBITMAP bmpIn = (HBITMAP) LoadImage(NULL, argv[1], IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
   FILE * out = _tfopen(argv[2], _T("wb"));
   DIBSECTION obj = {0};
   GetObject(bmpIn, sizeof(obj), &obj);
   cout << "dsBm.bmHeight = " << obj.dsBm.bmHeight << endl;
   cout << "dsBmih.biHeight = " << obj.dsBmih.biHeight << endl;
   cout << "sizeof(DIBSECTION) = " << sizeof(DIBSECTION) << endl;
   fwrite(&obj, sizeof(DIBSECTION), 1, out);
   int stride = (((obj.dsBmih.biWidth * obj.dsBmih.biBitCount) + 15) / 16) * 2;
   int bytecount = abs(obj.dsBmih.biHeight) * stride;
   vector<BYTE> bits(bytecount);
   GetBitmapBits(bmpIn, bytecount, &bits[0]);
   fwrite(&bits[0], 1, bytecount, out);
   fclose(out);
   return 0;
}

调用GetDIBits而不是GetBitmapBits。GetBitmapBits()的文档表明,这是为依赖于设备的位图返回数据,而您有一个独立于设备的位图。它们还表示不应使用此调用,只是为了实现16位兼容性。因此,使用GetDIBits应该可以做到这一点。

有关更多信息,请参阅。@Nerdtron,该链接直接与我的观察结果相矛盾-它声明自上而下的DIB将具有负高度,但在本例中它没有。那么,您是要返回具有正高度的自上而下的DIB吗?在你调用LoadImage之后,你用HBITMAP做什么来经验性地发现这一点?我猜您遗漏了一些细节,而不是API实际上返回了错误的数据。只是好奇加载后调用的API。@Nerdtron,我使用了GetObject和GetBitmapBits,并用自己的代码将结果直接写回一个文件。我还检查了调试器中的内存以进行双重检查。GetBitmapBits()的文档说它“将指定的依赖于设备的位图的位图位复制到缓冲区”。在这里,您已经加载了一个独立于设备的位图。因此,可能正在进行转换,因为GetBitmapBits的调用者希望从上到下实现某种功能。我只是在猜测,因为我总是叫GetDIBits。请注意,我链接到的文档说,无论如何都不应该调用它,应该调用GetDIBits。我打赌如果你打电话给GetDIBits,你会得到你想要的。
dsBm.bmHeight = 7
dsBmih.biHeight = 7
sizeof(DIBSECTION) = 84
00: 00 00 00 00 07 00 00 00 07 00 00 00 18 00 00 00
10: 01 00 18 00 00 00 11 00 28 00 00 00 07 00 00 00
20: 07 00 00 00 01 00 18 00 00 00 00 00 a8 00 00 00
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 ff ff ff 00 20 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff 00
80: 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 ff ff ff 00 40 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 ff ff ff 00 50 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff
c0: ff 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 ff ff ff 00 70 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 ff ff ff 00