【问题标题】:Converting HBitmap into byte array in Delphi在 Delphi 中将 HBitmap 转换为字节数组
【发布时间】:2013-03-26 15:10:05
【问题描述】:

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

【问题讨论】:

    标签: delphi winapi bitmap hbitmap


    【解决方案1】:

    你真是太幸运了。您的数组实际上是 128 个完全独立的 数组。当您设置维度时,Delphi 碰巧分配的每个数组都非常接近前一个数组,它们之间用 12 个字节分隔,用于处理每个动态数组中的各种簿记数据。通过告诉 API 您的位图为 131 像素宽而撒谎,使其在为较窄的位图复制数据时会跳过这些字节。

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

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

    【讨论】:

    • 还要确保行宽是 4 字节的倍数。在这种情况下,它已经是由于是 32bpp 图像。如果是 24bpp,宽度需要向上取整。
    • 无法以某种方式创建一个占用单个内存块的二维数组?
    • @Deanna 我知道位图中的行填充(这就是我使用 32 位来避免它的原因),但是谢谢!
    • 但是@Tom,你不会得到像素数组。您将获得 BGRA 四边形数组。在我看来,二维数组没有多大意义。
    • 无论如何,如果你想要一个二维数组,唯一的办法就是array [0..127] of array [0..63] of Cardinal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2013-04-02
    • 2014-08-08
    • 1970-01-01
    • 2013-02-23
    • 2011-09-21
    相关资源
    最近更新 更多