用Delphi实现24位真彩色图标
2011-10-12 12:25
253 查看
24位真彩色图形转化为ICO文件
在Delphi中我们可以采用如下方法将其他格式的图像我们要先把它转换为位图:
有了BMP图像了,我们还要改变图像的长和宽,使它们符合要求的图表尺寸,注意不超出255。我们用如下方法实现尺寸的改变:
生成位图的原料已经准备好了,就可以按ICO的文件头,关于程序的说明请看注释。
有了文件头,最终可以生成ICO了,同样详细内容请看程序的注释。
结束语
目前Delphi支持的图片格式比较多,例如我们可以给程序加上uses jpeg 语句就可以支持Jpeg格式的图像,当然如你给Delphi安装了支持其他图像格式的控件,使用本程序照样可以转换,得到的ICO文件可以供VB、Delphi等调用。程序的调试环境为Delphi7+WinxpSp2。
在Delphi中我们可以采用如下方法将其他格式的图像我们要先把它转换为位图:
procedure TFormMain.Pic2BMP(Picture:TPicture); var Bmp:TBitmap; begin if not(Picture.Graphic is TBitmap)then//判断是否是BMP图像 begin Bmp:=TBitmap.Create;//不是BMP图形,就生成一个 try Bmp.Width:=Picture.Width; bmp.Height:=Picture.Height; bmp.Canvas.Draw(0,0,Picture.Graphic);//把其他格式的图像复制到BMP Picture.Graphic:=Bmp;//原始非BMP图像转换为BMP图像 Finally Bmp.Free; end; end; end; |
procedure TFormMain.PicToMiniature(SourceBMP, DescBMP:TBitmap; picH,picW :Integer); var bmp: TBitmap; begin try bmp := TBitmap.Create;//生成位图 bmp.Assign(SourceBMP);//位图图像为SourceBMP, if picW>255 then PicW:=255;//长宽不可超出255 if picH>255 then picH:=255; bmp.Width := PicW; bmp.Height :=PicH; bmp.PixelFormat := pf24bit;//24位位图 bmp.Canvas.StretchDraw(Rect(0,0,picW,picH), SourceBMP);//使位图尺寸符合要求 DescBMP.Assign(bmp); finally bmp.Free; end; end; |
function TFormMain.MakICOHead(const Mem:TStream): Boolean; var//采用流来生成 BMPHead1:tagBITMAPFILEHEADER; BMPHead2: TBitmapInfoHeader; BitsTotal:DWord; begin Result:=False; Mem.Position:=0; Mem.Read(BMPHead1,SizeOf(tagBITMAPFILEHEADER));//读取BMP文件由文件头 Mem.Read(BMPHead2,SizeOf(TBitmapInfoHeader));// 读取BMP位图信息头 if BMPHead2.biCompression=0 then //位图没有压缩 begin if (BMPHead2.biWidth<=255) and (BMPHead2.biHeight <=255)then begin //caption:=IconFileName; IconHand.idEntries.bWidth:= Byte(BMPHead2.biWidth) ;//IOC宽 IconHand.idEntries.bHeight:=Byte(BMPHead2.biHeight); //IOC高 BitsTotal:=(Mem.Size-54)*2+40; //(BMP文件的大小- 文件头、位图信息头)*2+位图信息头=ICO数据量 //乘以二的原因是:加icXOR的信息 IconHand.idEntries.dwBytesInRes:= BitsTotal; IconHand.idEntries.dwImageOffset:=$00000016; Result:=True; end; Mem.Position:=0; end; end; |
function TFormMain.MakICOData( Mem:TStream): Boolean; var Mem1,Mem2:TMemoryStream; Size:Longint; BmtMapHandle2:TBitmapInfoHeader; begin Mem1:=TMemoryStream.Create; Mem2:=TMemoryStream.Create; Size:=Mem.Size-14;//跳过14字节的BMP文件由文件头 Mem.Position:=14; try Mem1.SetSize(Size); Mem.Read(Mem1.Memory^,Size);//BMP到Mem1 Mem1.Seek(0,soFromBeginning); Mem1.Read(BmtMapHandle2,sizeof(TBitmapInfoHeader));//BMP文件的信息头 Mem2.SetSize(Size-40);//跳过40字节的BMP文件信息头 FillChar(Mem2.Memory^,Size-40,$0);//Mem2填充0 ,使掩码效果为白色 Mem2.Position:=0; BmtMapHandle2.biHeight:=IconHand.idEntries.bHeight *2;//有两幅图 BmtMapHandle2.biSizeImage:=Mem2.Size*2; Mem1.Seek(0,soFromBeginning); Mem1.Write(BmtMapHandle2,sizeof(TBitmapInfoHeader)); Mem1.Position:=0; Mem.Size:=0; //MS.SetSize(0); Mem.Write(IconHand,sizeof(tagIconDir){22});//写ICO文件头 Mem.Write(Mem1.Memory^,Mem1.Size);//写BMP片 Mem.Write(Mem2.Memory^,Mem2.Size);//写掩码 Result:=True; finally FreeAndNil(Mem1); FreeAndNil(Mem2); end; end; |
目前Delphi支持的图片格式比较多,例如我们可以给程序加上uses jpeg 语句就可以支持Jpeg格式的图像,当然如你给Delphi安装了支持其他图像格式的控件,使用本程序照样可以转换,得到的ICO文件可以供VB、Delphi等调用。程序的调试环境为Delphi7+WinxpSp2。
相关文章推荐
- 用Delphi实现24位真彩色图标
- Delphi 实现任务栏多窗口图标显示
- Delphi 实现任务栏多窗口图标显示
- 24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
- Delphi实现提取可执行文件内部所有图标
- 利用Delphi实现系统状态栏图标
- printf()的Windows实现探秘及如何在控制台显示24位真彩色 (转)
- Delphi 实现任务栏多窗口图标显示(使用WS_EX_APPWINDOW风格)
- MFC实现多风格真彩色大图标工具栏按钮
- Delphi 实现任务栏多窗口图标显示
- c语言实现24位彩色图像二值化
- Delphi实现系统托盘图标
- 利用Delphi实现系统状态栏图标
- 24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
- 利用Delphi实现系统状态栏图标
- 实现实现24位真彩色工具条
- printf()的Windows实现探秘及如何在控制台显示24位真彩色
- 24位真彩色位图和8位灰度位图相互转换(C语言实现)
- 24位真彩色位图转换成8位灰度图片的代码实现
- 24位真彩色位图转换成8位灰度图片的代码实现