Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[306] bitmap을 icon으로 바꾸는 4가지 방법
하두고 [hadugo] 3622 읽음    2013-07-24 12:29
비트맵을 아이콘으로 바꿔야 하는데
인터넷에서 방법을 찾아보니 2가지가 있네요.

<1번쩨방법>
TImageList를 이용하는 방법으로 함수는 다음과 같습니다.

uses 
  Graphics, Controls 

Function CreateIconFromBitmap(Bitmap: TBitmap; TransparentColor: TColor): TIcon; 
begin 
  with TImageList.CreateSize(Bitmap.Width, Bitmap.Height) do 
  begin 
    try 
      AllocBy := 1; 
      AddMasked(Bitmap, TransparentColor); 
      Result := TIcon.Create; 
      try 
        GetIcon(0, Result); 
      except 
        Result.Free; 
        raise; 
      end; 
    finally 
      Free; 
    end; 
  end; 
end;

이 함수를 사용하는 경우 함수를 주기적으로 오랫동안 반복해서 실행하면 ImageList.Create에서 에러가 납니다.
ImageList를 Free해주고 Nil을 해줘도 재대로 안되는 건지.....



<2번쩨 방법>
TIconInfo를 이용하는 방법으로 다음과 같습니다.

var 
  ico : TIconInfo; 
  MyIcon : TIcon; 
  bmask, bcolr : TBitmap; 
begin 
    bmask := TBitmap.Create; 
    bcolr := TBitmap.Create; 
    MyIcon := TIcon.Create; 
  try 
    bmask.Width := Image1.Width; 
    bmask.Height := Image1.Height; 
    bcolr.Width := Image1.Width; 
    bcolr.Height := Image1.Height; 
    bcolr.Canvas.StretchDraw(RECT(0,0,bcolr.Width,bcolr.Height), 
       Image1.Picture.Graphic); 
    bmask.Canvas.Brush.Color := clBlack; 
    bmask.Canvas.FillRect(RECT(0,0,bmask.Width,bmask.Height)); 
    ico.fIcon := TRUE; 
    ico.hbmColor := bcolr.Handle; 
    ico.hbmMask := bmask.Handle; 
    ico.xHotspot := 0; 
    ico.yHotspot := 0; 
    MyIcon.Handle := CreateIconIndirect(ico); 
    Image2.Picture.Icon.Assign(MyIcon); 
    Application.Icon.Assign(MyIcon); 
  finally 
    bmask.Free; 
    bcolr.Free; 
    MyIcon.Free; 
  end; 
end; 

이건 첫번쩨 방법에서 발생하는 문제를 해결한 것입니다.
하지만 그냥 공부삼아서 비트맵과 아이콘에 대한 이해를 위한 자료일뿐 써먹을 데가 없습니다.
왜 써먹을데가 없냐구요?
실무에 적용해 보시면 압니다.




결국 인터넷에 돌아다니는 2가지 방법 모두 제게는 그림의 떡입니다.
그래서 실력이라고는 개뿔도 없는 제가 우여곡절 끝에 간신히 만들었는데
이런~! 만들고 보니 정말 별거 아니네요.

에구~! 이 간단한걸 몰라서 인터넷을 뒤졌다니.....

하여간 별거 아니긴 해도 인터넷에 떠도는 것보다는 쓸만하네요.



<3번쩨 방법>

function RGBBitmapTo1Bit(ABitmap : TBitmap; TransparentColor: TColor) : TBitmap;
var
  x, y : integer;
begin
  result := TBitmap.Create;
  result.width := ABitmap.width;
  result.height := ABitmap.height;

  for x := 0 to ABitmap.width do
     for y := 0 to ABitmap.height do
      begin
          if ABitmap.canvas.Pixels[x,y] = TransparentColor then
            result.Canvas.Pixels[x, y] := clWhite
          else
            result.Canvas.Pixels[x, y] := clBlack;
      end;
end;

Function BitmapToIconA(ABitmap: TBitmap; TransParentColor: TColor): TIcon;
var
    IconInfo: TIconInfo;
    MaskImage : TBitmap;
begin
    IconInfo.fIcon := False;
    IconInfo.hbmColor := ABitmap.Handle;
    MaskImage := TBitmap.Create;
    MaskImage := RGBBitmapTo1Bit(ABitmap, TransParentColor);
    IconInfo.hbmMask  := MaskImage.Handle;
    IconInfo.xHotspot := 0;
    IconInfo.yHotspot := 0;

    Result := TIcon.Create;
    Result.Handle := CreateIconIndirect(IconInfo);

    FreeAndNil(MaskImage);
end;



<4번쩨 방법>

Function BitmapToIconB(bcolr, bmask: TBitmap): TIcon;
var
    IconInfo: TIconInfo;
begin
    IconInfo.fIcon := False;
    IconInfo.hbmColor := bcolr.Handle;
    IconInfo.hbmMask  := bmask.Handle;
    IconInfo.xHotspot := 0;
    IconInfo.yHotspot := 0;

    Result := TIcon.Create;
    Result.Handle := CreateIconIndirect(IconInfo);
end;




이렇게 해서 결국 완성된 코드는 다음과 같습니다.

unit BMPToICOU;

interface
 uses
  Winapi.Windows, Vcl.Graphics, Vcl.Controls, System.SysUtils, System.Classes;

Procedure RGBBitmapTo1Bit(Const ABitmap : TBitmap; Const TransParentColor: TColor; Var BBitmap: TBitmap);
Procedure BitmapToIcon(Const ABitmap: TBitmap; Const TransParentColor: TColor; var RICon: TIcon); overload;
Procedure BitmapToIcon(Const bcolr: TBitmap; Const bmask: TBitmap; var RICon: TIcon); overload;

implementation

Procedure RGBBitmapTo1Bit(Const ABitmap : TBitmap; Const TransParentColor: TColor; Var BBitmap: TBitmap);
var
  x, y : integer;
begin
  BBitmap.width := ABitmap.width;
  BBitmap.height := ABitmap.height;

  for x := 0 to ABitmap.width do
      for y := 0 to ABitmap.height do
          if ABitmap.canvas.Pixels[x,y] = TransParentColor then
             BBitmap.Canvas.Pixels[x, y] := clWhite
          else
             BBitmap.Canvas.Pixels[x, y] := clBlack;
end;

Procedure BitmapToIcon(Const ABitmap: TBitmap; Const TransParentColor: TColor; var RICon: TIcon);
var
    IconInf: TIconInfo;
    MaskImage : TBitmap;
begin
    IconInf.fIcon := False;
    IconInf.hbmColor := ABitmap.Handle;
    MaskImage := TBitmap.Create;
    RGBBitmapTo1Bit(ABitmap, TransParentColor, MaskImage);
    IconInf.hbmMask  := MaskImage.Handle;
    IconInf.xHotspot := 0;
    IconInf.yHotspot := 0;

    RICon.Handle := CreateIconIndirect(IconInf);
    MaskImage.Free;
    MaskImage := Nil;
end;

Procedure BitmapToIcon(Const bcolr: TBitmap; Const bmask: TBitmap; var RICon: TIcon);
var
    IconInf: TIconInfo;
begin
    IconInf.fIcon := False;
    IconInf.hbmColor := bcolr.Handle;
    IconInf.hbmMask  := bmask.Handle;
    IconInf.xHotspot := 0;
    IconInf.yHotspot := 0;

    RICon.Handle := CreateIconIndirect(IconInf);
end;

end.
바람 [hiwaystar]   2013-08-11 12:41 X
감사합니다.

+ -

관련 글 리스트
306 bitmap을 icon으로 바꾸는 4가지 방법 하두고 3622 2013/07/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.