비트맵을 아이콘으로 바꿔야 하는데
인터넷에서 방법을 찾아보니 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.