200分求助: Bitmap转Icon (要求: 65536色彩)(200)

  • 主题发起人 主题发起人 aKnightChen
  • 开始时间 开始时间
A

aKnightChen

Unregistered / Unconfirmed
GUEST, unregistred user!
我的转化过程如下: procedure pTranBmpFileToIcon(sBmpFileName,sIconFileName:string;aMaskColor:TColor);var aIcon:TIcon; aBitmap:TBitmap; aImageList:TImageList;begin //如果用Result来返回ICON的话,会无法释放内存的 aIcon:=TIcon.Create; aBitmap:=TBitmap.Create; aImageList:=TImageList.Create(nil); try aBitmap.LoadFromFile(sBmpFileName); aImageList.GetIcon(aImageList.AddMasked(aBitmap,aMaskColor),aIcon); aIcon.SaveToFile(sIconFileName); finally aBitmap.Free; aImageList.Free; aIcon.Free; end;end;*******************************************************************************担是,我改了Graphics这个单元,让它支持65536色.改了之后,就无法实现Bitmap转Icon了,(未改之前,以上代码可以实现Bitmap转Icon,只是16色而已).******************************************************************************* http://topic.csdn.net/t/20060611/11/4814219.html 实际上,delphi是支持任意颜色的图标的.你自己可以试验一下:写个程序,读入 Image1.Picture.Icon.LoadFromFile();读入一个大于16色的图标,显示颜色是正常的.然 后保存Image1.Picture.Icon.SaveToFile();到文件,用其它软件打开该图标,颜色也是正 常的.所以说,delphi是支持高彩色的. 但是,如果你把它赋给一个TIcon再保存,就只有16位色了.原因很简单.Delphi的Graphics 单元有BUG.实际上,它会调用Graphics单元的 procedure WriteIcon(Stream: TStream; Icon: HICON; WriteLength: Boolean);过程. 问题就在这里: ... InternalGetDIBSizes(IconInfo.hbmColor, ColorInfoSize, ColorBitsSize, 16); ... InternalGetDIB(IconInfo.hbmColor, 0, ColorInfo^, ColorBits^, 16); 把上面的两个16改成65536,然后删除Graphics.dcu,重新编译.即可支持65536色了(XP图标).
 
调用过程: pTranBmpFileToIcon(sTmpBmpFile,sTmpIconFile,clWhite);//aMaskColor=clWhite
 
自已顶一下.希望哪位师兄点拔一下.
 
再顶一下.希望哪位师兄点拔一下.
 
自已搞定了.procedure pTranBmpFileToIcon(sBmpFileName,sIconFileName:string);var IconSizeX : integer; //图像转化 bmp-> ico IconSizeY : integer; aBmpAndMask : TBitmap; aBmpXorMask : TBitmap; IconInfo : TIconInfo; Icon : TIcon;begin {Get the icon size} IconSizeX := GetSystemMetrics(SM_CXICON); IconSizeY := GetSystemMetrics(SM_CYICON); {Create the "And" mask} aBmpAndMask := TBitmap.Create; aBmpAndMask.Monochrome := true; aBmpAndMask.Width := IconSizeX; aBmpAndMask.Height := IconSizeY; {Draw on the "And" mask} aBmpAndMask.Canvas.Brush.Color := clBlack; aBmpAndMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY)); {Create the "XOr" mask} aBmpXorMask := TBitmap.Create; aBmpXorMask.Width := IconSizeX; aBmpXorMask.Height := IconSizeY; aBmpXorMask.LoadFromFile(sBmpFileName); {Create a icon} Icon := TIcon.Create; IconInfo.fIcon := true; IconInfo.xHotspot := 0; IconInfo.yHotspot := 0; IconInfo.hbmMask := aBmpAndMask.Handle; IconInfo.hbmColor := aBmpXorMask.Handle; //hbmMask和hbmColor交换一下可以画出超大的ICON,但是只能是黑白图像. Icon.Handle := CreateIconIndirect(IconInfo); {Destroy the temporary bitmaps} aBmpAndMask.Free; aBmpXorMask.Free; {Draw as a test} Icon.SaveToFile(sIconFileName); {Free the icon} Icon.Free;end;
 
不行,还是失败,晕,昨天可能忘了改Graphics.pas了
 
哦,上述程序没错,只是我在缩放BMP时,要先铺一层白色: Canvas.Brush.Color:=clWhite; Canvas.FillRect(Rect(0, 0, iWidth, iLength));然后才用这个BMP去转化为ICO才能成功
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部