【问题标题】:delphi convert byte of array to bitmapdelphi 将数组的字节转换为位图
【发布时间】:2016-02-02 16:32:14
【问题描述】:

如何使用delphi 7将数组的字节转换为tbitmap,数组包含内存中的png头。

bits[0]:= $9E;
bits[1]:= $20;
bits[2]:= $00;
bits[3]:= $00;
bits[4]:= $70;
bits[5]:= $AD;
bits[6]:= $BD;
bits[7]:= $1A;

我正在尝试使用 tmemorystream 将数组存储到位图中,并使用来自 Gustav Daud 的 PNGImage 来分配位图,但不是运气。

uses .., PNGImage;

procedure TForm1.Button1Click(Sender: TObject);
var
  png      : TPNGObject;
  stream   : TMemoryStream;
  bits     : array[0..7] of byte;
begin
  bits[0]:= $9E;
  bits[1]:= $20;
  bits[2]:= $00;
  bits[3]:= $00;
  bits[4]:= $B8;
  bits[5]:= $EE;
  bits[6]:= $C4;
  bits[7]:= $1A;

  png:= TPNGObject.Create;
  try
    stream:= TMemoryStream.Create;
    try
      stream.Write(bits[0], sizeOf(bits));
      stream.Position:= 0;

      png.LoadFromStream(stream);
    finally
      stream.Free;
      JvImage1.Picture.Assign(png);
    end;
  finally
    png.Free;
  end;
end;

这给了我流错误,有没有关于将数组字节写入内存流的正确写法?

谢谢,

【问题讨论】:

  • 你不是在处理 BMP 图像,所以不要将你的字节加载到 TBitmap 对象中。摆脱你的 bitm 变量。此外,您的数组在 ot 中有 9 个字节,但您只填充了 8 个字节。如果你想要一个 8 字节的数组,你的数组需要声明为 [0..7] 而不是 [0..8]

标签: arrays delphi bitmap delphi-7


【解决方案1】:

TJvImage.Picture 是标准的TPicture,这意味着它的Bitmap 属性是标准的TBitmap。您不能在 VCL 中将 PNG 图像加载到 TBitmap 中(您可以在 FireMonkey 中,但 Delphi 7 不支持)。您需要为PNG图像使用合适的第三方TGraphic派生类(Delphi 7本身不支持PNG,这是在更高版本中添加的),例如:

uses
  ..., PngImage;

var
  Png: TPngObject;
try
  Png := TPngObject;
  try
    stream := TMemoryStream.create;
    try
      stream.Write(bits[0], sizeof(bits));
      stream.Position:= 0;
      Png.LoadFromStream(stream);
    finally
      stream.Free;
    end;
    JvImage1.Picture.Assign(Png);
  finally
    Png.free;
  end;
end;

Delphi 7, load PNG to TImage


更新:但是,话虽如此,您显示的字节一开始就不是有效的 PNG 图形标头。 PNG 总是 以以下 8-byte signature 开头:

89 50 4E 47 0D 0A 1A 0A

这些字节也不代表任何 PNG data chunk header(以防您不小心跳过了 PNG 标头)。

事实上,您显示的字节似乎并不代表任何常用的图形格式。因此,您可能误解了您要检查的内存。

【讨论】:

  • 关于使用来自 Gustavo Daud 的 TPngObject,给我一个新的异常 EPnginvalidheader is not valid PNG。我确定字节数组是 [base_address]+0x28 内存地址的 png 标头是 16 个字节数组“9E 20 00 00 B8 EE C4 1A F4 9E 01 00 68 59 BF 1A”
  • 是否可以在数组的第一个添加 4 字节的 PNG 标头,确保地址中的数组位置正确。我正在使用十六进制内存编辑器来更改值,似乎图像也发生了变化。
  • @ahrie:您显示的字节不属于 PNG 标头。 PNG 的前 8 个字节 始终是 89 50 4E 47 0D 0A 1A 0A(参见 Portable Network Graphics, File header)。而且这些字节也不属于任何 PNG data chunk header
  • @ahrie:无论您认为,您在内存中检查的内容都不是 PNG(除非您跳过所有可以告诉您什么的 PNG 标头/块信息)字节表示)。 base_address 实际上指向什么,你为什么要查看 +0x28 字节?你真正想要完成什么?听起来您正试图查看另一个进程的数据,对吗?
  • 我目前想在游戏中读取图像,游戏使用PNG创建头像。我正在寻找其他工具游戏可以读取这些图像,但似乎不在 delphi 它的 c++ 中。使用CE搜索镜像地址,发现[[[[[[base_address]+00376164]+0x28]+0x28]+0x00]+0x6C]为镜像静态地址。将值更改为其他头像值似乎成功,正在使用 tlhelp32 单元读取进程
猜你喜欢
  • 2010-09-26
  • 2018-05-06
  • 2013-01-14
  • 2013-07-29
  • 2012-11-09
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多