昨天说到了从SD卡加载程序,今天说说Windows下ICO图标的文件格式及显示。最初我想认识图标是为了在读取文件时先显示一个图标加文件名,然后点它一下就打开这个文件,现在图标可以显示了,文本文档也基本可以显示了,但还没有把它们联系起来。有点累了,休息几天再做这事吧,呵呵。
查了一下现在Windows下的图标基本都是ico格式的,还有早一点的BMP位图格式,参看了网上资料后觉得ico文件是包含BMP位图的,所以这里就直接讲ico图标文件了。先要分清楚ico文件和ico图标,一个ico文件里有好多个图标,有不同大小和颜色,这就是为什么在桌面上能够变化图标的大小,其实只是读取同一文件下的不同数据。任何文件都是以二进制的格式存储的,每一种类型的文件定义了相应的格式,应用软件则按照规定的格式读取文件。
ICO文件的格式如下(按实际存储的顺序):
----------------------------------------------------------------------------
查了一下现在Windows下的图标基本都是ico格式的,还有早一点的BMP位图格式,参看了网上资料后觉得ico文件是包含BMP位图的,所以这里就直接讲ico图标文件了。先要分清楚ico文件和ico图标,一个ico文件里有好多个图标,有不同大小和颜色,这就是为什么在桌面上能够变化图标的大小,其实只是读取同一文件下的不同数据。任何文件都是以二进制的格式存储的,每一种类型的文件定义了相应的格式,应用软件则按照规定的格式读取文件。
ICO文件的格式如下(按实际存储的顺序):
----------------------------------------------------------------------------
偏移量 字节数 描述 典型值(16进制)
----------------------------------------------------------------------------
(一、文件头6字节)
000(000)2 保留的字节 00 00
002(002)2 资源类型 01 00 (01为图标,02为光标)
004(004)2 图象个数 01 00 表示这个文件中包含图标数量
(二、图像信息块16字节) 几个图标就有几个图像信息块
006(006)1 图标宽度 10
007(007)1 图标高度 10 图标高宽
008(008)1 颜色计数 10(02=单色, 00≥256色)
009(009)1 未用 00
010(00A)4 前两字节表示图像数据里调色板数量,后两字节为每像素点在XOR数据中所需的二进制位数
014(00E)4 图象数据块的长度 28 01 00 00(10进制=296)
018(012)4 图象数据块相对于文件头部的偏移量 16 00 00 00(10进制=22)
(三、BMP信息头40字节) //一个图像的数据从此处开始,地址对应上面的偏移量
022(016)4 BMP 信息头结构长度 28 00 00 00(10进制=40)
026(01A)4 图像宽度 10 00 00 00
030(01E)4 图像高度(XOR图高度+AND图高度) 20 00 00 00
034(022)2 位面板数 01 00
036(024)2 每象素所占位数 04 00 以上两项与图像信息块内容相同
038(026)4 象素数据的压缩类型 00 00 00 00(表示未压缩)
042(02A)4 图象数据的长度 C0 00 00 00(10进制=192)
046(02E)16 未用 16个00
(四、XOR位图的调色板64字节)
4个字节表示一个颜色,若每像素用4个二进制位表示则有16种颜色,此处就是64字节,
同理若为8位,则有256种颜色,占1024字节
若为24位或32位真彩色则无此块数据
4个字节表示一个颜色,若每像素用4个二进制位表示则有16种颜色,此处就是64字节,
同理若为8位,则有256种颜色,占1024字节
若为24位或32位真彩色则无此块数据
(五、XOR位图的数据)
例:
数据扫描的顺序为从左下角开始从左到右,从下到上,
若每像素有8位表示颜色,读到第一个字节时用这个字节的值去索引调色板中的表示颜色的4字节数据为左下角第一个点的颜色值,依此类推。若为真彩色则不用索引,读出数据直接为颜色值。
(六、单色AND位图的数据)
AND位图的作用是使图标透明,即使图标未使用的区域显示桌面原来的颜色。此数据固定一个二进制位表示一个像素。要注意的是每一行所占的字节数必须为四字节对齐。例如,48*48的图标,一行有48个点,一行则需要占用两个四字节,共8字节的数据,后面不用的位数忽略,白占空间。
要显示某一点时,先取AND位图中相应点的值与原屏幕值与,再与XOR中值异或。
在看程序前,先看实验的照片吧:
上图是存储在SD卡中的文件,SYS.BIN为程序,用于从SD卡加载到内存中运行,两个图标,另外一个是字库文件和文本文件,下篇日志会用到。
上图为程序运行后在开发板上显示的两个图标,照的不是很清晰。
要显示某一点时,先取AND位图中相应点的值与原屏幕值与,再与XOR中值异或。
在看程序前,先看实验的照片吧:
上图是存储在SD卡中的文件,SYS.BIN为程序,用于从SD卡加载到内存中运行,两个图标,另外一个是字库文件和文本文件,下篇日志会用到。
上图为程序运行后在开发板上显示的两个图标,照的不是很清晰。