2013.12.14 02:15
웹상의 이미지를 화면에 표시해야 할경우가 있습니다.
그때 사용하려고 라이브러리 형태로 Unit을 만들어 공개합니다.
구현 내용은
IdHttp로 웹상의 데이터를 Stream으로 받고, TImage.Bitmap을 Stream에서 읽는 방식입니다.
TBitmap을 class helper로 확장해서 구현했으니, class helper가 어떤때 쓰이는지도 참고하시면 좋을 것 같습니다.
iOS(아이폰5), Android(Nexus 7), 윈도우(Windows 7)에서 모두 정상 동작 확인했습니다.
3가지 메소드는 (1) 웹상의 이미지를 그대로 가져오기, (2) 웹상의 이미지와 함께 원본 크기 가져오기, (3) 웹상의 이미지를 Thumbnail형태로 가져오기 입니다.
procedure TForm3.Button1Click(Sender: TObject);
var
Size: Int64;
begin
Image1.Bitmap.LoadFromUrl('http://cfile2.uf.tistory.com/image/2353573E529FDAAC032731', Size);
Memo1.Lines.Add('1 : ' + Format('W: %d, H: %d, S: %d', [Image1.Bitmap.Width, Image1.Bitmap.Height, Size]))
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
Image1.Bitmap.LoadFromUrl('http://cfile2.uf.tistory.com/image/2353573E529FDAAC032731');
Memo1.Lines.Add('2 : ' + Format('W: %d, H: %d', [Image1.Bitmap.Width, Image1.Bitmap.Height]))
end;
procedure TForm3.Button3Click(Sender: TObject);
begin
Image1.Bitmap.LoadThumbnailFromURL('http://cfile2.uf.tistory.com/image/2353573E529FDAAC032731', 100, 100);
Memo1.Lines.Add('3 : ' + Format('W: %d, H: %d', [Image1.Bitmap.Width, Image1.Bitmap.Height]))
end;
unit FMX.Devgear.Extentions;
interface
uses
System.Classes, System.Types, FMX.Graphics;
type
TBitmapHelper = class helper for TBitmap
private
function LoadStreamFromUrl(AUrl: string): TMemoryStream;
public
procedure LoadFromUrl(AUrl: string; var outSize: Int64); overload;
procedure LoadFromUrl(AUrl: string); overload;
procedure LoadThumbnailFromUrl(AUrl: string; const AFitWidth, AFitHeight: Integer);
end;
implementation
uses
IdHttp, IdTCPClient;
function TBitmapHelper.LoadStreamFromUrl(AUrl: string): TMemoryStream;
var
Http: TIdHttp;
begin
Result := TMemoryStream.Create;
Http := TIdHttp.Create(nil);
try
try
Http.Get(AUrl, Result);
except
end;
finally
Http.Free;
end;
end;
procedure TBitmapHelper.LoadFromUrl(AUrl: string; var outSize: Int64);
var
Stream: TMemoryStream;
begin
Stream := LoadStreamFromUrl(AUrl);
outSize := Stream.Size;
try
if Stream.Size > 0 then
begin
LoadFromStream(Stream);
end
finally
Stream.Free;
end;
end;
procedure TBitmapHelper.LoadFromUrl(AUrl: string);
var
tmp: Int64;
begin
LoadFromUrl(AUrl, tmp);
end;
procedure TBitmapHelper.LoadThumbnailFromUrl(AUrl: string; const AFitWidth,
AFitHeight: Integer);
var
Bitmap: TBitmap;
scale: Single;
begin
LoadFromUrl(AUrl);
scale := RectF(0, 0, Width, Height).Fit(RectF(0, 0, AFitWidth, AFitHeight));
Bitmap := CreateThumbnail(Round(Width / scale), Round(Height / scale));
try
Assign(Bitmap);
finally
Bitmap.Free;
end;
end;
end.