用Delphi实现24位真彩色图标
来源:互联网 发布:小鸡模拟器数据迁移 编辑:程序博客网 时间:2024/04/30 02:31
24位真彩色图形转化为ICO文件
在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;
有了BMP图像了,我们还要改变图像的长和宽,使它们符合要求的图表尺寸,注意不超出255。我们用如下方法实现尺寸的改变:
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;
生成位图的原料已经准备好了,就可以按ICO的文件头,关于程序的说明请看注释。
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;
有了文件头,最终可以生成ICO了,同样详细内容请看程序的注释。
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位真彩色图标
- 实现实现24位真彩色工具条
- 32位真彩色与24位真彩色区别
- 32位真彩色与24位真彩色区别
- 24、32位真彩色
- 24位真彩色工具栏
- Toolbar控件:32位真彩色大图标
- 24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
- 轻松制作24位真彩色工具栏
- 轻松制作24位真彩色工具栏
- MFC-Toolbar(24位真彩色)
- 24位真彩色位图和8位灰度位图相互转换(C语言实现)
- 24位真彩色位图转换成8位灰度图片的代码实现
- 显示真彩色工具条图标
- 24位真彩色图像转8位灰度图像
- C# 图像 24位转32位(真彩色)
- printf()的Windows实现探秘及如何在控制台显示24位真彩色 (转)
- printf()的Windows实现探秘及如何在控制台显示24位真彩色
- 2011.10.12
- java 多线程1
- c# 读取TIniFile配置文件
- 调用系统的媒体音量控制显示
- Android 应用程序级全局变量
- 用Delphi实现24位真彩色图标
- GPS导航电子地图以及标准格式介绍
- ECMA-262-3 深入解析:第五章 函数
- 紧急通知~!
- MFC 自定义消息四步曲
- 虚拟旅游 宅人新爱
- android全局变量2
- 大蒜12种不可不知的健康功效
- 调用父类构造方法时编译器的走向原理.