Delphi中HBitmap到字节数组的转换
我试图将hBitmap转换为字节数组,但我不想从单位图形使用TBitmap。 我的输入图像是128x64x32位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
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]