2017-12-28 28 views
0

Delphi 10.2の使用TClientDataSetを右クリックし、「MyBase Xml UTF-8テーブルに保存」を選択します。私は、バイナリビットマップのBase64文字列表現であると信じるものを変換しようとしているMyBase XmlファイルからのTPicture

<FIELD attrname="BMP" fieldtype="bin.hex" SUBTYPE="TypedBinary" WIDTH="1"/> 

:として

<ROW NAME="Angel Fish" SIZE="2" WEIGHT="2" AREA="Computer Aquariums" BMP="AQAAAfY+AABCTfY+AAAAAAAAdgAAACgAAADIAAAAoAAAAAEA ... 

BMPフィールドが定義されている:私は今、この形式のXMLファイルを持っていますファイルを画像に挿入する。これまでのところ、私はこれを持っている:$ 74DCCBB2で

最初のチャンス例外:

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は、この例外がスローされます。例外クラスEInvalidGraphicに 'サポートされていないストリーム形式'というメッセージがあります。

私が間違っていることを教えてもらえますか?どうもありがとう。

+0

は、なぜあなたは生のXMLを読んでいると、ちょうど戻ったTClientDatasetにロードし、のTFieldを通してそれにアクセスしていない:あなたの代わりにTBitmapTPictureを置き換える必要がありますので

ところで、TPicture.LoadFromStream()はちょうど、TPicture.Bitmap.LoadFromStream()を呼び出しますか? –

+0

私はこのXMLファイルをC#で再利用したいので、イメージをマイナスできます。 C#で画像を読み込めなかったので、私は問題を解決するためにDelphiに戻ってくると思っていました。 –

答えて

3

表示されたbase64文字列は、実際のBMPデータ(0x42 0x4D ...)の前に8バイト(0x01 0x00 0x00 0x01 0xF6 0x3E 0x00 0x00)で始まるバイナリデータにデコードします。 BMP属性のsubtypeTypedBinaryです。これは、データがBMPイメージであることを示すメタデータヘッダーのようなものです。ストリームデータをTPictureにロードする前に、これらの開始バイトを省略する必要があります。

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

私は感謝の言葉を避けるべきだと思いますが、とにかくありがとう、それは解決策でした。 –

関連する問題