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

时间:2013-03-26 15:10:06

标签: delphi winapi bitmap hbitmap

我正在尝试将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?

1 个答案:

答案 0 :(得分:7)

你非常幸运。您的阵列实际上是128个完全独立的数组。当您设置尺寸时,Delphi碰巧将每个阵列分配得非常接近前一个阵列,其中12个字节将它们分开,从而计算每个动态阵列中的各种簿记数据。通过告诉API你的位图是131像素宽使得它在为较窄的位图复制数据时跳过这些字节。

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

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