|
引言 Delphi是目前广泛使用的可视化开发工具,它自身带有一个图片、图标的编辑器——Image Editor,但是到Delphi7为止,都不能进行真彩图标的编辑,可以说是一个遗憾。笔者通过对图标文件的研究,实现了产生24位真彩色图标。 图标文件的格式 首先,分析一个具体的图标 。在CS1.6中有一个图标game.ico( ),如果用WinHex等可以进行16进制编辑的软件打开这个图标文件,我们可以看到如下数据: 00 00 01 00 04 00 10 10 00 00 00 00 00 00 68 05 00 00 46 00 00 00 10 10 00 00 00 00 00 00 68 03 00 00 AE 05 00 00 20 20 00 00 00 00 00 00 A8 08 00 00 16 09 00 00 20 20 00 00 00 00 00 00 A8 0C 00 00 BE 11 00 00 28 00 00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00 00 00 40 01 00 00 47 46 6C 65 6D 69 6E 67 00 01 00 00 00 00 00 00 00 00 下面我们就说一说,这些数据的具体含义。一个图标文件(*.ICO),实际上可以含有多个图标.通常,每个图标都会被转换为针对特定显示设备的图标图像。图标文件由文件头和数据组成, ICO文件一开始,是一个叫做tagIconDir的记录型的结构,在Delphi中这样来描述(括号内的数值,是针对CS图标的具体数据): tagIconDir = packed record idReserved:WORD;// 保留域,目前始终为 0(开始的数据$00 00) idType:WORD; //定义为资源类型,图标值为 $0001、光标是$0002($0001) idCount:WORD; //idCount 表示的是这个文件里包含了几个图标($0004) idEntries:array[0..0] of tagIconDirEntry; //不包括本数组,以上一共6个字节 end; 这个记录中的idEntries 是个数组结构,这个结构的大小不是始终为 1 的一个数组,它需要根据图标数目 ( idCount ) 来确定真实的数组大小。它的类型为tagIconDirEntry记录,定义如下: tagIconDirEntry = packed record bWidth:BYTE;// 图标图片的显示宽度,以像素为单位,最大值为255 ($10=16D) bHeight:BYTE;// 图标图片的显示高度,以像素为单位,最大值为255 ($10=16D) bColorCount:BYTE;// 图标图片的颜色数($00) bReserved:BYTE;// 保留域总是 0 ($00) wPlanes:WORD;// 图标图片的位面数 ($00 00) wBitCount:WORD;// 图标图片的颜色深度($00 00) dwBytesInRes:DWORD;// 图标图片占用的数据量($00000568) dwImageOffset:DWORD; // 图标图片的开始位置 ($00000046) end;.// 这个结构是16个字节
|