投稿したXMLには画像が含まれていません。画像の内容のSHA-1ハッシュが含まれています。ハッシュを取得するのは、最初にその画像を一度取得したことがある場合のみなので、キャッシュされたバージョンを新たに要求する代わりに表示できます。
そのハッシュを含む画像がない場合は、新しいvcardをリクエストしてください。PHOTO
それが到着したら、それが利用可能であれば、要素を読んでください。2つのサブ要素、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;
上記のコードは、Delphi2007を使用してBase64文字列をバイナリとしてディスクに保存するための回答で説明されているOmniXMLBase64Decode
の関数を使用しています。値を取得したら、それをに割り当てるか、sで実行できる他のことを実行できます。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;