あなたがポストされたXMLは、画像が含まれていません。それは画像の内容のSHA-1 hashを含んでいます。一度そのイメージを取り込んでしまった場合に備えて、ハッシュを最初に取得するだけです。新しいバージョンをリクエストする代わりに、キャッシュされたバージョンを表示することができます。
ハッシュの画像がない場合は、新しいvcardをリクエストしてください。到着したら、PHOTO
要素があればそれを読んでください。それは2つのサブ要素、BINVAL
とTYPE
を持つかもしれません。 BINVAL
には、イメージのBase-64エンコードバージョンが含まれ、TYPE
には、image/jpegまたはimage/pngなど、イメージタイプのMIMEタイプ識別子が含まれます。
バイナリデータをデコードし、TFileStream
またはTMemoryStream
などのストリームに格納します。次に、あなたが持っているイメージの種類にふさわしい子孫TGraphic
を選択します。それはTPngImage
、またはTBitmap
かもしれません。クラスをインスタンス化し、ストリームの内容をロードするように指示します。上記のコードはSaving a Base64 string to disk as a binary using Delphi 2007への答えで説明OmniXMLからBase64Decode
機能を使用しています
function CreateGraphicFromVCardPhoto(const BinVal, MimeType: string): TGraphic;
var
Stream: TStream;
GraphicClass: TGraphicClass;
begin
Stream := TMemoryStream.Create;
try
if not Base64Decode(BinVal, Stream) then
raise EBase64Decode.Create;
Stream.Position := 0;
GraphicClass := ChooseGraphicClass(MimeType);
Result := GraphicClass.Create;
try
Result.LoadFromStream(Stream);
except
Result.Free;
raise;
end;
finally
Stream.Free;
end;
end;
:それはこのような何かを行くだろう。 TGraphic
の値を取得したら、TImage
に割り当てるか、TGraphic
でできることを実行します。
ChooseGraphicClass
機能は次のように動作するかもしれません:
function ChooseGraphicClass(const MimeType: string): TGraphicClass;
begin
if MimeType = 'image/bmp' then
Result := TBitmap
else if MimeType = 'image/png' then
Result := TPngImage
else if MimeType = 'image/gif' then
Result := TGifImage
else if MimeType = 'image/jpeg' then
Result := TJpegImage
else
raise EUnknownGraphicFormat.Create(MimeType);
end;
が、これはphytonの例ですが、私はデルファイ http://collincode.wordpress.com/2009/01/31/xmpp-jabber-photo-必要module-2/ – cvg
Python関数 'recieve_vcard()'はこれが単にbase64でエンコードされたデータであることを示しています。 StackOverflowで "[delphi] base64"検索を使用して、この形式をエンコードおよびデコードするためのリンクとサンプルコードをたくさん見つけてください。 – mghie
@mghie:なぜこれを答えるように書いて受け入れられるのですか? –