来自 MyBase Xml 文件的 T 图片
TPicture from MyBase Xml file
使用 Delphi 10.2 我右键单击 TClientDataSet 并选择 'Save to MyBase Xml UTF-8 table.' 我现在有一个 XML 格式的文件:
<ROW NAME="Angel Fish" SIZE="2" WEIGHT="2" AREA="Computer Aquariums" BMP="AQAAAfY+AABCTfY+AAAAAAAAdgAAACgAAADIAAAAoAAAAAEA ...
BMP字段定义为:
<FIELD attrname="BMP" fieldtype="bin.hex" SUBTYPE="TypedBinary" WIDTH="1"/>
我正在尝试将我认为是二进制位图文件的 Base64 字符串表示形式转换为图片。到目前为止,我得到了这个:
uses
XMLDoc, Vcl.ComCtrls, XMLIntf, IdCoder, IdCoderMIME, IdGlobal,
Vcl.ExtCtrls;
procedure TForm2.Button1Click(Sender: TObject);
var Doc:TXMLDocument;
First:IXMLNode;
Str:String;
Bytes: TIdBytes;
Pic:TPicture;
Stream:TMemoryStream;
Writer: TBinaryWriter;
begin
Doc:=TXMLDocument.Create(Self);
Doc.FileName:='D:\temp\ClientDataSet2.xml';
Doc.Active:=true;
First:=Doc.DocumentElement.ChildNodes['ROWDATA'].ChildNodes.First;
Str:=First.Attributes['BMP'];
Bytes:=TIdDecoderMIME.DecodeBytes(Str);
Stream:=TMemoryStream.Create;
Writer:=TBinaryWriter.Create(Stream);
Writer.Write(TBytes(Bytes));
Stream.Position:=0;
Pic:=TPicture.Create;
Pic.LoadFromStream(Stream);
Image1.Picture:=Pic;
RichEdit1.Text:=Str;
end;
但是,TPicture.LoadFromStream 抛出这个异常:
第一次机会例外 $74DCCBB2。异常 class EInvalidGraphic 消息 'Unsupported stream format'.
谁能告诉我我做错了什么?非常感谢。
您显示的 base64 字符串解码为以实际 BMP 数据 (0x42 0x4D ...
) 之前的 8 个字节 (0x01 0x00 0x00 0x01 0xF6 0x3E 0x00 0x00
) 开头的二进制数据。 BMP
属性的 subtype
是 TypedBinary
,因此这很可能是某种元数据 header,表明数据是 BMP 图像。在将流数据加载到 TPicture
.
之前,您需要省略那些开始字节
顺便说一句,TPicture.LoadFromStream()
只是调用 TPicture.Bitmap.LoadFromStream()
,因此您应该将 TPicture
替换为 TBitmap
:
Bmp := TBitmap.Create;
try
Bmp.LoadFromStream(Stream);
Image1.Picture.Assign(Bmp);
finally
Bmp.Free;
end;
使用 Delphi 10.2 我右键单击 TClientDataSet 并选择 'Save to MyBase Xml UTF-8 table.' 我现在有一个 XML 格式的文件:
<ROW NAME="Angel Fish" SIZE="2" WEIGHT="2" AREA="Computer Aquariums" BMP="AQAAAfY+AABCTfY+AAAAAAAAdgAAACgAAADIAAAAoAAAAAEA ...
BMP字段定义为:
<FIELD attrname="BMP" fieldtype="bin.hex" SUBTYPE="TypedBinary" WIDTH="1"/>
我正在尝试将我认为是二进制位图文件的 Base64 字符串表示形式转换为图片。到目前为止,我得到了这个:
uses
XMLDoc, Vcl.ComCtrls, XMLIntf, IdCoder, IdCoderMIME, IdGlobal,
Vcl.ExtCtrls;
procedure TForm2.Button1Click(Sender: TObject);
var Doc:TXMLDocument;
First:IXMLNode;
Str:String;
Bytes: TIdBytes;
Pic:TPicture;
Stream:TMemoryStream;
Writer: TBinaryWriter;
begin
Doc:=TXMLDocument.Create(Self);
Doc.FileName:='D:\temp\ClientDataSet2.xml';
Doc.Active:=true;
First:=Doc.DocumentElement.ChildNodes['ROWDATA'].ChildNodes.First;
Str:=First.Attributes['BMP'];
Bytes:=TIdDecoderMIME.DecodeBytes(Str);
Stream:=TMemoryStream.Create;
Writer:=TBinaryWriter.Create(Stream);
Writer.Write(TBytes(Bytes));
Stream.Position:=0;
Pic:=TPicture.Create;
Pic.LoadFromStream(Stream);
Image1.Picture:=Pic;
RichEdit1.Text:=Str;
end;
但是,TPicture.LoadFromStream 抛出这个异常:
第一次机会例外 $74DCCBB2。异常 class EInvalidGraphic 消息 'Unsupported stream format'.
谁能告诉我我做错了什么?非常感谢。
您显示的 base64 字符串解码为以实际 BMP 数据 (0x42 0x4D ...
) 之前的 8 个字节 (0x01 0x00 0x00 0x01 0xF6 0x3E 0x00 0x00
) 开头的二进制数据。 BMP
属性的 subtype
是 TypedBinary
,因此这很可能是某种元数据 header,表明数据是 BMP 图像。在将流数据加载到 TPicture
.
顺便说一句,TPicture.LoadFromStream()
只是调用 TPicture.Bitmap.LoadFromStream()
,因此您应该将 TPicture
替换为 TBitmap
:
Bmp := TBitmap.Create;
try
Bmp.LoadFromStream(Stream);
Image1.Picture.Assign(Bmp);
finally
Bmp.Free;
end;