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

标签 delphi winapi bitmap hbitmap

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

最佳答案

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

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

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

关于delphi - 在Delphi中将HBitmap转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15640549/

相关文章:

delphi - 如何添加在 OSX 上按预期工作的菜单项分隔符?

c++ - 是否可以在 Win32 编辑控件中突出显示文本?

android - 如何制作空/不可见的位图?

c# - 如何在光标位置裁剪图像的一部分?

delphi - 如何获取 DBGrid 单元格的屏幕坐标

windows - 如何使运行时从服务器打开文件列表中删除的 exe(从共享启动)

WinForms float 窗口(如Delphi7 IDE)

C# 3DES加密转C解密

c++ - 在启动特定子进程后挂起进程

android - 如何在 Android 上将原始相机数据转换为位图