는 XML이 사진을 포함하지 않습니다
XMPP 서버는이 XML을 전송합니다. 그림의 내용이 SHA-1 hash입니다. 이전에 이미 이미지를 가져온 경우에 대비하여 해시를 처음 만 얻으므로 새 버전을 요청하는 대신 캐시 된 버전을 표시 할 수 있습니다.
해시가있는 이미지가없는 경우 새 vcard를 요청하십시오. 도착하면 PHOTO
엘리먼트 (있는 경우)를 읽습니다. 두 하위 요소, BINVAL
및 TYPE
이있을 수 있습니다. BINVAL
에는 Base-64 인코딩 버전의 이미지가 포함되고 TYPE
에는 image/jpeg 또는 image/png과 같은 이미지 유형에 대한 MIME 유형 식별자가 포함됩니다.
이진 데이터를 디코딩하여 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;
위의 코드는 Saving a Base64 string to disk as a binary using Delphi 2007에 대한 답변에서 설명 OmniXML에서 Base64Decode
기능을 사용합니다. 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;
이이 phyton의 예입니다하지만 난 델파이 http://collincode.wordpress.com/2009/01/31/xmpp-jabber-photo- 필요 module-2/ – cvg
파이썬 함수'recieve_vcard()'는 이것이 단지 base64로 인코딩 된 데이터임을 보여줍니다. StackOverflow에서 "[delphi] base64"검색을 사용하여이 형식을 인코딩하고 디코딩하는 예제 코드와 링크를 많이 찾으십시오. – mghie
@mghie : 이것을 대답으로 써서 받아 들일 수는없는 이유는 무엇입니까? –