gpt4 book ai didi

xml - 如何在 Delphi 中显示 XMPP (Jabber) vcard 照片?

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:11 24 4
gpt4 key购买 nike

如何从 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 hash图片的内容。最初,您只会获得哈希值,以防您之前已经获取过该图像一次,因此您可以显示缓存的版本而不是重新请求它。

如果您没有包含该哈希值的图片,请申请一张新的 vcard。当它到达时,读取 PHOTO 元素(如果可用)。它可能有两个子元素,BINVALTYPEBINVAL 将包含图像的 Base-64 编码版本,TYPE 将包含图像类型的 MIME 类型标识符,例如 image/jpegimage/png

解码二进制数据并将其存储在流中,例如TFileStreamTMemoryStream。接下来,选择哪个 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;

上面的代码使用了 OmniXML 中的 Base64Decode 函数,在对 Saving a Base64 string to disk as a binary using Delphi 2007 的回答中描述.获得 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;

关于xml - 如何在 Delphi 中显示 XMPP (Jabber) vcard 照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1366423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com