3

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>
4

1 に答える 1

6

投稿したXMLには画像が含まれていません。画像の内容のSHA-1ハッシュが含まれています。ハッシュを取得するのは、最初にその画像を一度取得したことがある場合のみなので、キャッシュされたバージョンを新たに要求する代わりに表示できます。

そのハッシュを含む画像がない場合は、新しいvcardをリクエストしてください。PHOTOそれが到着したら、それが利用可能であれば、要素を読んでください。2つのサブ要素、BINVALおよびが含まれる場合がありTYPEます。BINVALBase-64でエンコードされたバージョンの画像TYPEが含まれ、画像タイプのMIMEタイプ識別子(image/jpegimage/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;

上記のコードは、Delphi2007を使用してBase64文字列をバイナリとしてディスクに保存するための回答で説明されているOmniXMLBase64Decodeの関数を使用しています。値を取得したら、それをに割り当てるか、sで実行できる他のことを実行できます。TGraphicTImageTGraphic

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;
于 2009-09-02T16:15:08.677 に答える