您发布的 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;
上面的代码使用Base64Decode
来自OmniXML的函数,在使用 Delphi 2007 将 Base64 字符串作为二进制文件保存到磁盘的答案中进行了描述。一旦你有了这个TGraphic
值,你就可以把它分配给 aTImage
或者做任何你可以用TGraphic
s 做的事情。
该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;