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;
更新:但是,话虽如此,您显示的字节并不是有效的 PNG 图形header。 PNG 总是 以以下 8-byte signature:
开头
89 50 4E 47 0D 0A 1A 0A
这些字节也不代表任何 PNG data chunk header(以防您不小心跳过了 PNG header)。
事实上,您显示的字节似乎并不代表任何 commonly-used 图形格式。所以你可能误解了你试图检查的记忆。
如何使用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;
更新:但是,话虽如此,您显示的字节并不是有效的 PNG 图形header。 PNG 总是 以以下 8-byte signature:
开头89 50 4E 47 0D 0A 1A 0A
这些字节也不代表任何 PNG data chunk header(以防您不小心跳过了 PNG header)。
事实上,您显示的字节似乎并不代表任何 commonly-used 图形格式。所以你可能误解了你试图检查的记忆。