在Delphi中将HBitmap转换为字节数组

6

我正在尝试将hBitmap转换为字节数组,但是我不想使用来自Graphics单元的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呢?

1个回答

7
你非常幸运。你的数组实际上是128个完全独立的数组。当你设置维度时,Delphi恰好分配了每个数组非常靠近前一个数组,它们之间有12个字节的间隔,这些间隔是为每个动态数组中的各种簿记数据而计算的。通过告诉API你的位图宽度为131像素,可以在为较窄的位图复制数据时跳过这些字节。
API期望一个单一的连续字节块,这不是多维动态数组。多维动态数组实际上只是看作普通的动态数组,其元素类型恰好是另一个动态数组。
要修复你的代码,需要一个单维数组;将其长度设置为位图高度和宽度的乘积。

@DavidHeffernan 我知道我可以制作一个封套,但我喜欢简短的代码,在没有任何封套的情况下,我的代码更短,更易读 :) - Tom
@TLama,我完全可以使用BGRA四边形。 - Tom
@Tom,二维数组和由一维数组组成的一维数组之间有很大的区别。在你的情况下,你有后者,但想要前者。我不使用Delphi,所以不知道语法。 - Deanna
1
无论如何,如果你想要一个二维数组,唯一的方法是 array [0..127] of array [0..63] of Cardinal - David Heffernan
@TLama 这是一个由数组组成的数组,其中包含32位(大多数情况下)的无符号整数。 - Deanna
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接