2017-12-28 7 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 객체를 통해 접근? –

+0

이 XML 파일을 C#에서 재사용하고 싶습니다. 이미지를 제외 할 수 있습니다. C#에서 이미지를 가져올 수 없었기 때문에 문제를 해결하기 위해 델파이로 돌아갈 것이라고 생각했습니다. –

답변

3

표시 한 base64 문자열은 실제 BMP 데이터 (0x42 0x4D ...)보다 8 바이트 (0x01 0x00 0x00 0x01 0xF6 0x3E 0x00 0x00)로 시작하는 바이너리 데이터를 디코딩합니다. BMP 속성의 subtypeTypedBinary이므로 데이터가 BMP 이미지임을 나타내는 일종의 메타 데이터 헤더 일 수 있습니다. TPicture에 스트림 데이터를로드하기 전에 시작 바이트를 생략해야합니다.

BTW, TPicture.LoadFromStream()TPicture.Bitmap.LoadFromStream() 호출, 그래서 당신은 TBitmap 대신에 TPicture를 교체해야합니다 :

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

나는 고맙다고 말하면 안되지만 어쨌든 고맙다. 해결책이었다. –