Delphi で XMPP (Jabber) vcard 写真を表示するにはどうすればよいですか?
質問
XMPP vcard から写真 (JPEG 形式だと思われるアバター画像) を読み取り、Delphi TImage コントロールに表示するにはどうすればよいですか?
XMPP サーバーは次の XML を送信します。
<presence id="e3T50-75" to="cvg@esx10-2022/spark" from="semra@esx10-2022"
type="unavailable">
<x xmlns="vcard-temp:x:update">
<photo>897ce4538a4568f2e3c4838c69a0d60870c4fa49</photo>
</x>
<x xmlns="jabber:x:avatar">
<hash>897ce4538a4568f2e3c4838c69a0d60870c4fa49</hash>
</x>
</presence>
解決
投稿した XML には画像が含まれていません。含まれているのは、 SHA-1ハッシュ 写真の内容です。以前に一度その画像をフェッチしたことがある場合に備えて、最初はハッシュのみを取得するため、新たにリクエストする代わりにキャッシュされたバージョンを表示できます。
そのハッシュを持つイメージがない場合は、新しい vcard をリクエストしてください。届いたら読んでみてください PHOTO
要素 (利用可能な場合)。2 つのサブ要素がある場合があります。 BINVAL
そして TYPE
. BINVAL
Base-64 でエンコードされたバージョンのイメージが含まれます。 TYPE
画像タイプの MIME タイプ識別子 (例:) が含まれます。 画像/jpeg または 画像/png.
バイナリ データをデコードし、次のようなストリームに保存します。 TFileStream
または TMemoryStream
. 。次にどれを選択しますか TGraphic
子孫はあなたのイメージの種類に適しています。それは可能性があります TPngImage
, 、あるいはそうかもしれない TBitmap
. 。クラスをインスタンス化し、ストリームのコンテンツをロードするように指示します。それは次のようになります:
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;
上記のコードでは、 Base64Decode
からの関数 オムニXML, 、への回答に記載されています Delphi 2007 を使用して Base64 文字列をバイナリとしてディスクに保存する. 。入手したら、 TGraphic
値を割り当てることができます。 TImage
または他にできることは何でもしてください TGraphic
s.
の 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;