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

delphi convert byte of array to bitmap

如何使用delphi 7,数组包含内存中的png header。

bits[0]:= E;
bits[1]:= ;
bits[2]:= [=11=];
bits[3]:= [=11=];
bits[4]:= ;
bits[5]:= $AD;
bits[6]:= $BD;
bits[7]:= A;

我正在尝试使用 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]:= E;
  bits[1]:= ;
  bits[2]:= [=12=];
  bits[3]:= [=12=];
  bits[4]:= $B8;
  bits[5]:= $EE;
  bits[6]:= $C4;
  bits[7]:= A;

  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;

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

谢谢,

TJvImage.Picture是一个标准TPicture,也就是说它的Bitmap属性是一个标准TBitmap。您不能 将 PNG 图像加载到 VCL 中的 TBitmap(您可以在 FireMonkey 中加载,Delphi 7 不支持)。您需要为 PNG 图像使用合适的 third-party TGraphic-derived class(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 图形header。 PNG 总是 以以下 8-byte signature:

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

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

事实上,您显示的字节似乎并不代表任何 commonly-used 图形格式。所以你可能误解了你试图检查的记忆。