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

Tom*_*Tom 6 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);
Run Code Online (Sandbox Code Playgroud)

这给了我一个很好的形象(当然是颠倒的),但我不得不把131放入biWidth,这对我来说并没有多大意义.为什么不能是128?

Rob*_*edy 7

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

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

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

  • +1很好.其实我会说@Tom在这里不走运! (3认同)