将任一图象转换为图标
常规的将图像转换为图标的方式是创建两个和目标图标大小一致的图片,一个是图象,一个是掩膜(都是bmp图).然后使用图标建立的函数创建图标。此方法简单实用,除了要建立两个中间位图之外不须其他的特别资源。但此方式建立的图标,本人测试了多种方法,都只能建立256色的图标,不能创建真彩色图标。
为了建立一个真彩的图标,我费尽心机。有一天灵光一闪:TImageList类不是可以进行位图和图标的转换吗?于是详细研究了TImageList类的属性和方法。结果发现了一些重大线索:
TImageList.Create(integer;integer) 重载创建过程,两个参数指定位图的宽度和高度
TImageList.Add(img,mask:TBitmap)将一个位图和一个掩膜位图加进去成为一个图片项目
TImageList.GetICon(integer;TIcon)获取某个位置,将获取的值以图标方式存储在第二个参数中
我本人做了一下测试,果真屡试不爽,不仅可以制作出真彩图标,而且可以建立48x48的真彩图标.
下面附上部分源代码:
常规的制作图标的源码:
Function ImgToICO(img:Tgraphic;icosize:integer):TICON;
var
bmp:TBitmap;
maskBMP:TBitmap;
rct:TRECt;
IconInfo : TIconInfo;
begin
//绘制图标图片
bmp:=TBitmap.create;
bmp.width:=icosize;
bmp.height:=icosize;
rct.left:=0;rct.top:=0;rct.right:=icosize;rct.bottom:=icosize;
bmp.canvas.strethDraw(rct,img);
//绘制图标掩膜图片
maskBMP:=TBitmap.create;
maskBMP.width:=icosize;MaskBmp.heigt:=icosize;
maskBMp.canvas.brush.color:=0;
maskBmp.canvas.fillrect(rct);
//设置图标畔?
iconInfo.fIcon:=true;
iconInfo.xHotspot:=0;
iconInfo.yHotspot :=0;
iconInfo.hbmMask :=maskbmp.handle;
iconInfo.hbmColor :=bmp.handle;
//创建图标
Result:=TICON.create;
result.handle:=CreateIconIndirect(IconInfo);
maskBmp.free;
Bmp.free;
end;
通过TImageList制作图标:
function Img2Ico(img:TGRaphic;icosize:integer):TICON;
var
ilist:TImageList;
bmp:TBitmap;
maskBmp:TBitmap;
begin
ilist:=TImageList.create(nil);
ilist.width=icosize;
ilist.height=icosize;
bmp:=TBitmap.create;
bmp.width:=icosize;
bmp.height:=icosize;
rct.left:=0;rct.top:=0;rct.right:=icosize;rct.bottom:=icosize;
bmp.canvas.strethDraw(rct,img);
maskBMP:=TBitmap.create;
maskBMP.width:=icosize;MaskBmp.heigt:=icosize;
maskBMp.canvas.brush.color:=0;
maskBmp.canvas.fillrect(rct);
//创建图标
ilist.add(bmp,maskbmp);
Result:=TICOn.create;
ilist.getICon(0,result);
end;