Delphi で XMPP (Jabber) vcard 写真を表示するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1366423

  •  21-09-2019
  •  | 
  •  

質問

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 または他にできることは何でもしてください TGraphics.

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top