我正在尝试将hBitmap转换为字节数组,但我不想使用单位Graphics中的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?
答案 0 :(得分:7)
你非常幸运。您的阵列实际上是128个完全独立的数组。当您设置尺寸时,Delphi碰巧将每个阵列分配得非常接近前一个阵列,其中12个字节将它们分开,从而计算每个动态阵列中的各种簿记数据。通过告诉API你的位图是131像素宽使得它在为较窄的位图复制数据时跳过这些字节。
API需要单个连续的字节块,这不是多维动态数组。多维动态数组实际上只是普通的动态数组,其元素类型恰好是另一个动态数组。
要修复代码,您需要一个单维数组;将其长度设置为位图高度和宽度的乘积。