delphi将数组的字节转换为位图

时间:2016-02-02 16:32:14

标签: arrays delphi bitmap delphi-7

如何使用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;

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

谢谢,

1 个答案:

答案 0 :(得分:1)

TJvImage.Picture是标准TPicture,这意味着其Bitmap属性是标准TBitmap。您无法将PNG图像加载到VCL中的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标题)。

实际上,您显示的字节似乎不代表任何常用的图形格式。所以你可能误解了你想要检查的记忆。