我正试图将hBitmap转换为字节数组,但我不想使用单位图形的TBitmap。我的输入图像是128x64x32bit。
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期望单个连续的字节块,这不是多维动态数组。多维动态数组实际上就是元素类型恰好是另一个动态数组的普通动态数组。
修复你的代码,你需要一个一维数组;设置其长度为位图高度和宽度的乘积。