cvg*_*cvg 3 xml delphi xmpp vcf-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>
Run Code Online (Sandbox Code Playgroud)
您发布的XML不包含图片.它包含图片内容的SHA-1哈希值.您最初只获取哈希值,以防您之前已经获取过该图像,因此您可以显示缓存版本而不是重新请求它.
如果您没有具有该哈希的图像,则请求新的vcard.当它到达时,读取PHOTO元素,如果它可用.它可能有两个子元素,BINVAL和TYPE.BINVAL将包含图像的Base-64编码版本,TYPE并将包含图像类型的MIME类型标识符,例如image/jpeg或image/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;
Run Code Online (Sandbox Code Playgroud)
上面的代码使用OmniXML中的Base64Decode函数,在使用Delphi 2007将二维64字符串保存到磁盘的答案中描述.获得该值后,您可以将其分配给或使用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;
Run Code Online (Sandbox Code Playgroud)