2017-12-28 15 views
0

Verwenden von Delphi 10.2 Ich Rechtsklick auf ein TClientDataSet und wählen Sie "In MyBase Xml UTF-8 Tabelle speichern." Ich habe jetzt eine XML-Datei mit folgendem Format:TPicture von MyBase Xml-Datei

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

Das BMP-Feld definiert ist als:

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

Ich versuche zu konvertieren, was ich glaube, eine Base64 String-Darstellung eines binären Bitmap sein file in ein Bild. Bisher habe ich diese bekam:

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; 

Allerdings wirft TPicture.LoadFromStream diese Ausnahme:

erste Chance bei $ 74DCCBB2. Ausnahmeklasse EInvalidGraphic mit Meldung 'Nicht unterstütztes Stream-Format'.

Könnte mir bitte jemand sagen, was ich falsch mache? Danke vielmals.

+0

Warum liest du den rohen XML und nicht einfach wieder in eine TClientDataset einlegen und es durch die TField zugreifen? –

+0

Da ich diese XML-Datei in C# wiederverwenden möchte, kann ich das abzüglich des Bildes tun. Da ich das Bild nicht in C# importieren konnte, dachte ich, ich würde zu Delphi zurückkehren, um die Probleme zu lösen. –

Antwort

3

Die von Ihnen angezeigte base64-Zeichenfolge dekodiert Binärdaten, die mit 8 Bytes (0x01 0x00 0x00 0x01 0xF6 0x3E 0x00 0x00) vor den eigentlichen BMP-Daten (0x42 0x4D ...) beginnen. Das subtype des BMP Attributs ist TypedBinary, also ist dies wahrscheinlich eine Art Metadaten-Header, um anzuzeigen, dass die Daten ein BMP-Bild sind. Sie müssen diese Anfangsbytes vor dem Laden der Streamdaten in TPicture auslassen.

BTW, TPicture.LoadFromStream() nennt nur TPicture.Bitmap.LoadFromStream(), so sollten Sie TPicture mit TBitmap statt ersetzen:

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

Ich sollte es vermeiden, Danke zu sagen, aber danke trotzdem, das war die Lösung. –

Verwandte Themen