如何在Delphi中显示XMPP(Jabber)vcard照片? [英] How do you display an XMPP (Jabber) vcard photo in Delphi?

查看:61
本文介绍了如何在Delphi中显示XMPP(Jabber)vcard照片?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何从XMPP电子名片(头像,我认为是JPEG格式)中读取照片,并将其显示在Delphi TImage控件中?

How can I read a photo from an XMPP vcard (an avatar picture, which I think is in JPEG format) and display it in a Delphi TImage control?

XMPP服务器发送以下XML:

The XMPP server sends this 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哈希图片内容.如果您之前已经获取过一次图像,则最初只会获得哈希值,因此您可以显示缓存的版本,而不必重新请求它.

The XML you posted does not contain the picture. It contains the SHA-1 hash of the picture's contents. You only get the hash, initially, in case you have already fetched that image once before, so you can display the cached version instead of requesting it anew.

如果您没有带有该哈希的图像,则请求一个新的vcard.到达时,请阅读 PHOTO 元素(如果有).它可能有两个子元素, BINVAL TYPE . BINVAL 将包含该图像的Base-64编码版本,而 TYPE 将包含该图像类型的MIME类型标识符,例如 image/jpeg image/png .

If you don't have an image with that hash, then request a new vcard. When it arrives, read the PHOTO element, if it's available. It may have two subelements, BINVAL and TYPE. BINVAL will contain the Base-64-encoded version of the image, and TYPE will contain the MIME type identifier for the image type, such as image/jpeg or image/png.

解码二进制数据并将其存储在流中,例如 TFileStream TMemoryStream .接下来,选择适合您所拥有图像类型的 TGraphic 后代.它可能是 TPngImage ,也可能是 TBitmap .实例化该类,并告诉它加载流的内容.它会是这样的:

Decode the binary data and store it in a stream, such as TFileStream or TMemoryStream. Next, choose which TGraphic descendant is appropriate for the kind of image you have. It might be TPngImage, or it might be TBitmap. Instantiate the class, and tell it to load the stream's contents. It would go something like this:

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;

上面的代码使用了 OmniXML 中的 Base64Decode 函数,如 保存Base64的答案使用Delphi 2007 将字符串作为二进制文件存入磁盘.一旦有了 TGraphic 值,就可以将其分配给 TImage 或用 TGraphic s做其他的事情.

The code above uses the Base64Decode function from OmniXML, described in the answer to Saving a Base64 string to disk as a binary using Delphi 2007. Once you have the TGraphic value, you can assign it to a TImage or do whatever else you can do with 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;

这篇关于如何在Delphi中显示XMPP(Jabber)vcard照片?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆