MyBase Xml文件中的TPicture

时间:2017-12-28 21:31:57

标签: xml delphi delphi-10.2-tokyo

使用Delphi 10.2我右键单击TClientDataSet并选择'保存到MyBase Xml UTF-8表。'我现在有一个这种格式的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的第一次机会异常。具有消息&#39;不支持的流格式&#39;的异常类EInvalidGraphic。

有人可以告诉我我做错了什么吗?非常感谢。

1 个答案:

答案 0 :(得分:3)

您显示的base64字符串解码为以实际BMP数据(0x01 0x00 0x00 0x01 0xF6 0x3E 0x00 0x00)之前的8字节(0x42 0x4D ...)开头的二进制数据。 subtype属性的BMPTypedBinary,因此这可能是某种元数据标头,表示数据是BMP图像。在将流数据加载到TPicture之前,您需要省略那些开始字节。

BTW,TPicture.LoadFromStream()只需拨打TPicture.Bitmap.LoadFromStream(),因此您应该将TPicture替换为TBitmap,而不是:

Bmp := TBitmap.Create;
try
  Bmp.LoadFromStream(Stream); 
  Image1.Picture.Assign(Bmp);
finally
  Bmp.Free;
end;