웹상의 이미지를 화면에 표시해야 할경우가 있습니다.

그때 사용하려고 라이브러리 형태로 Unit을 만들어 공개합니다.


구현 내용은 

IdHttp로 웹상의 데이터를 Stream으로 받고, TImage.Bitmap을 Stream에서 읽는 방식입니다.


TBitmap을 class helper로 확장해서 구현했으니, class helper가 어떤때 쓰이는지도 참고하시면 좋을 것 같습니다.


iOS(아이폰5), Android(Nexus 7), 윈도우(Windows 7)에서 모두 정상 동작 확인했습니다.


3가지 메소드는 (1) 웹상의 이미지를 그대로 가져오기, (2) 웹상의 이미지와 함께 원본 크기 가져오기, (3) 웹상의 이미지를 Thumbnail형태로 가져오기 입니다.


샘플소스

BitmapUrl.zip 


사용방법

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.



사진 2013. 12. 13. 오전 12 24 12.jpg 


Screenshot_2013-12-13-00-28-21.jpg


Windows 7 x64 2013-12-13 00-22-10.jpg