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

그때 사용하려고 라이브러리 형태로 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

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15405
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13957
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16493
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22044
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23266
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18920
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39241
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174691
863 이 달의 기술자료 - 2018년 09월 file 험프리 2018.08.31 496
862 [무료 제공툴] 파이어몽키 스텐실(FMX Stencils) [3] 관리자 2018.08.24 1190
861 [개발환경 설정] 안드로이드 기기 연결 시 'USB 디버깅 허용' 창이 표시되지 않는 경우 조치 방법 file 험프리 2018.08.21 1864
860 RAD스튜디오 로드맵 - 2018년 8월 file 관리자 2018.08.09 1057
859 이 달의 기술자료 - 2018년 08월 file 험프리 2018.07.31 524
858 [마감임박] Google의 새로운 Android API Level 26 요구사항 해결방법 2가지 [2] 험프리 2018.07.31 1233
857 [기술백서] 애플리케이션에 새 생명을 불어넣으세요. file 관리자 2018.07.16 1094
856 [고객사례-POS, 델파이] MalyKangurek POS (포스 시스템 프로그램) 관리자 2018.07.13 4105
855 이 달의 기술자료 - 2018년 07월 file 험프리 2018.06.28 505
854 [업데이트][패치][10.2.3] 코드 자동완성 및 iOS 11.3 패치 험프리 2018.06.28 819
853 [고객사례-게임, 델파이] BVS Solitaire Collection (카드 게임) 관리자 2018.06.25 903
852 [군산대학교] 모바일 프로그래머 양성 과정 (무료) file 관리자 2018.06.25 498
851 [발표자료] 20180621 부산 세미나-What's NEW!! RAD스튜디오: 최신 OS지원과 플랫폼 확장 방안 file 관리자 2018.06.25 345
850 C++빌더와 파이어몽키로 정말 멋진 UI 완성하기: 앱 템플릿 관리자 2018.06.20 765
849 기존 시스템을 웹(Web)으로 확장하기 위해 고려해야 할 두 가지 포인트 관리자 2018.06.11 1382
848 델파이/C++빌더 개발자를 위한 웹 개발 with ExtJS! 관리자 2018.06.04 954
847 RAD서버 솔루션 시리즈: 필드 서비스 애플리케이션 관리자 2018.06.01 623
846 C++, IDE(통합개발환경)으로 개발하면 어떤 점이 좋을까요? 관리자 2018.05.30 901
845 이 달의 기술자료 - 2018년 06월 file 험프리 2018.05.25 509
844 C++표준의 진화 김원경 2018.05.25 1048