如何使用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;
这给我流错误,是否有关于将数组字节写入内存流的正确写法?
谢谢,
答案 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;
更新:但是,话虽如此,您显示的字节不是有效的PNG图形标头。 PNG 始终以以下8-byte signature:
开头89 50 4E 47 0D 0A 1A 0A
这些字节也不代表任何PNG data chunk header(如果您不小心跳过了PNG标题)。
实际上,您显示的字节似乎不代表任何常用的图形格式。所以你可能误解了你想要检查的记忆。