Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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
Delphi中HBitmap到字节数组的转换_Delphi_Winapi_Bitmap_Hbitmap - Fatal编程技术网

Delphi中HBitmap到字节数组的转换

Delphi中HBitmap到字节数组的转换,delphi,winapi,bitmap,hbitmap,Delphi,Winapi,Bitmap,Hbitmap,我试图将hBitmap转换为字节数组,但我不想从单位图形使用TBitmap。 我的输入图像是128x64x32位 var TheBits: array of array of Cardinal; begin with info.bmiHeader do begin biWidth:=131; biHeight:=64; biSize:=SizeOf(TBITMAPINFOHEADER); biCompression:=BI_RGB; biBitC

我试图将hBitmap转换为字节数组,但我不想从单位图形使用TBitmap。 我的输入图像是128x64x32位

var TheBits: array of array of Cardinal;
begin   
  with info.bmiHeader do begin
    biWidth:=131;
    biHeight:=64;
    biSize:=SizeOf(TBITMAPINFOHEADER);
    biCompression:=BI_RGB;
    biBitCount:=32;
    biPlanes:=1;
    biSizeImage:=0;
  end; 

  DC := CreateCompatibleDC(0);    
  SetLength(TheBits, 128, 64);    
  GetDIBits(DC, BmpHandle, 0, 64,@TheBits[0][0],Info,DIB_RGB_COLORS);

这给了我一个很好的图像(当然是倒过来的),但我不得不把131放到biWidth中,这对我来说真的没有意义。为什么不能是128呢?

你非常幸运。您的数组实际上是128个完全独立的数组。当您设置维度时,Delphi恰巧将每个数组分配得与前一个数组非常接近,用12个字节将它们分隔开,以说明每个动态数组中的各种簿记数据。通过告诉API你的位图有131像素宽的谎言,使得它在为更窄的位图复制数据时跳过了这些字节

API需要单个连续的字节块,而不是多维动态数组。多维动态数组实际上就是普通的动态数组,其元素类型恰好是另一个动态数组


要修复代码,您需要一个一维数组;将其长度设置为位图高度和宽度的乘积。

还要确保行宽度是4字节的倍数。在本例中,它已经是一个32bpp的映像。如果是24bpp,则需要将宽度向上舍入。无法创建占用单个内存块的2d数组?@Deanna我知道位图中的行填充(这就是为什么我使用32位来避免它),但谢谢!但是@Tom,你不会得到像素数组。您将获得BGRA四边形阵列。在我看来,二维数组没有多大意义。无论如何,如果你想要一个二维数组,唯一的方法是基数的数组[0..63]的
array[0..127]