专家 联合会
论坛 博客
 | 网站首页 | 新闻中心 | 合作经济 | 农村金融 | 监  管 | 联社动态 | 内部参考 | 经营管理 | 高层传真 | 法规之苑 | 电子化建设 | 
 | 热点透视 | 理论前沿 | 基层声音 | 专家团队 | 焦点评论 | 人  物 | 文  化 | 图片中心 | 下载频道 | 网络联合会 | 网络联盟 | 
载入中...
■ 您现在的位置: 中国合作金融联合网 >> 电子化建设 >> 软硬兼施 >> 电子化建设正文
Windows图标-Icon文件格式分析
    
 
作者:佚名 文章来源:软硬兼施 点击数: 更新时间:2008-2-4

最近想做个随时间变化显示为时间的秒数的动态变化图标,查找了很多资料,基本都是使用BitBlt+BuildIcon或CreateIcon等API函数来生成图标,感觉操作过程比较复杂,而且在Picture使用这些函数制造图标的话,运行效果不太理想,因此想到用现有的BMP位图数据换算为ICON文件保存后再用LoadPicture载入后使用还比较合用。找了很多关于图标的资料后,中文的VB构造ICON文件说明都没找到,最后只能自己利用图标制作工具生成些图标分析结合英文的关于C语言的图标构造说明来自己摸索出合适VB使用的ICON文件格式资料,因为在CSDN也没找到VB的图标文件说明,因此将自己的一些分析心得post上来以供大家交流。
ICON文件结构有点类似BMP文件,不过因为ICON文件支持多资源,所以比BMP文件多了一个索引目录的结构,以供检索文件内的各个图标资源。图像数据部分除了多一段1bpp的掩码部分以外,剩余的部分和BMP文件的位图信息段及图像信息段是相同的。

1.文件头

C原型定义:
typedefstruct
{
wordidreserved;//reserved(mustbe0)
wordidtype;//resourcetype(1foricons)
wordidcount;//howmanyimages?
icondirentryidentries[1];//anentryforeachimage(idcountof'em)
}icondir,*lpicondir;

VB定义:
PublicTypeicondir
idreservedAsInteger';word//reserved(mustbe0):保留字必须是0
idtypeAsInteger';word//resourcetype(1foricons):资源类型,1是图标,2就是光标了?
idcountAsInteger';word//howmanyimages?:有几个图像资源
identries()Asicondirentry'[1]'icondirentry;//anentryforeachimage(idcountof'em):每个图像的入口定义
EndType

文件内的资源个数由idcount来定义,读取文件的时候,先读入
idreservedAsInteger
idtypeAsInteger
idcountAsInteger
3个变量后,再用idcount来定义identries(idcount)类型的数量。

1.1icondirentry结构,图标资源索引目录结构。

C原型定义:
typedefstruct
{
bytebwidth;//width,inpixels,oftheimage
bytebheight;//height,inpixels,oftheimage
bytebcolorcount;//numberofcolorsinimage(0if>=8bpp)
bytebreserved;//reserved(mustbe0)
wordwplanes;//colorplanes
wordwbitcount;//bitsperpixel
dworddwbytesinres;//howmanybytesinthisresource?
dworddwimageoffset;//whereinthefileisthisimage?
}icondirentry,*lpicondirentry;

VB定义:
PublicTypeicondirentry
bwidthAsByte';byte//width,inpixels,oftheimage:图像宽度,以象素为单位。一个字节
bheightAsByte';byte//height,inpixels,oftheimage:图像高度,以象素为单位。一个字节
bcolorcountAsByte';byte//numberofcolorsinimage(0if>=8bpp):图像中的颜色数(如果是>=8bpp的位图则为0)
breservedAsByte';byte//reserved(mustbe0):保留字必须是0
wplanesAsInteger';word//colorplanes:为目标设备说明位面数,其值将总是被设为1
wbitcountAsInteger';word//bitsperpixel:每象素所占位数。
dwbytesinresAsLong';dword//howmanybytesinthisresource?:这份资源所占字节数
dwimageoffsetAsLong';dword//whereinthefileisthisimage?:图像数据(iconimage)起点偏移位置。
EndType'icondirentry

其中dwbytesinres记录了该目录指向的图像数据区的尺寸,dwimageoffset指的是该段目录指向的图像数据段的起点在整个文件中的偏移量。

2.图像数据段

C原型定义:
typdefstruct
{
bitmapinfoheadericheader;//dibheader
rgbquadiccolors[1];//colortable
byteicxor[1];//dibbitsforxormask
byteicand[1];//dibbitsforandmask
}iconimage,*lpiconimage;

VB定义:
PublicTypeiconimage'{
icheaderAsbmih';DIB位图信息头:bitmapinfoheader//dibheader,注:bmih是我简化了bitmapinfoheader的名称。
'used:bisize,biwidth,biheight(xorH+andH)即2倍高度,biplanes,bibitcount,bisizeimage.
'allothermembersmustbe0.
iccolors()Asrgbq'[1]';色彩表:rgbquad//colortable
icxor()AsByte'[1];byte//dibbitsforxormask:DIB结构的图像数据。XOR掩码?
'本文讨论的格式以16色的ICON文件为主,每字节表示两个象素4bpp。
'对于256色的文件,icxor数组每字节表示一个象素即:8bpp。
icand()AsByte'[1];byte//dibbitsforandmask:DIB结构的图像数据。AND掩码?1bpp
EndType'}iconimage

其中的icheader采用的是DIB结构的BMP文件(常用)的位图信息头的定义类型(参见BMP文件结构分析),但是其中使用的关键变量只用到:bisize,biwidth,biheight,biplanes,bibitcount,bisizeimage.几个,其他变量必须为0。其中的biheight变量和BMP文件里稍有不同,在BMP文件里,该变量指的是文件的高度象素量,而在ICON文件里,可能由于采用了两段掩码图像数据的缘故,该变量的值一般设定为高度象素量的2倍。
色彩表iccolors的尺寸由文件使用的色彩数量决定,对于16色的图像数据为:iccolors(0to15),对于256色的图像数据为:iccolors(0to255)。但这个数量不是绝对的,

最后定义的时候还是应该由icheader中的bisize,biwidth,biheight,bibitcount变量和索引目录中的dwbytesinres计算得出=(dwbytesinres-biSize-AndMaskall-(biHeight/2)*Lb)/4'其中AndMaskall为1bpp那段掩码的尺寸,Lb为每行象素所占的字节数。
icxor数据尺寸为Lb乘以图标高度(biHeight/2)。icand尺寸为1bpp的掩码数据段每行所占字节数乘以图标高度(biHeight/2)。
每行象素所占字节数=((icheader.biWidth*icheader.biBitCount+31)And&HFFFFFFE0)\8,是4的倍数,象素位数不够4倍数的用&H00补齐。

[1] [2] [3] 下一页  

电子化建设录入:蔡丽峰    责任编辑:蔡丽峰 
 
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
  • 上一个电子化建设:
  • 下一个电子化建设: 没有了
  •  
    相关新闻:
  • WINDOWS最危险的十个漏洞

  • 四个Windows 2000版本的区别

  • 教你如何最有效防电脑辐射方法

  • 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)


    肖四如:农信社改革与发展

    太平岛问题是台湾出的连

    曹雪芹是怎么描写雪景的

    阮玲玉的真假遗书之谜(图

    轻松几招让男人长寿十年

    喜欢妖魔化中国的日本媒

    信合博客
     
    本网论坛
     
       频道精选
       热点新闻
       财经精选
     奥运之年易涨难跌或将演绎牛市
     美国经济是否在一步步走向衰退
     中国薪酬涨幅和员工流失率亚洲
       农村金融
     农发行农村基础设施贷款不能超
     “流动银行”到村来!
     破解中小企业发展融资难题
       高层传真
     刘明康:农村金融服务的改善已
     刘明康:农信社改革应坚持股份
     蒋定之:鼓励并购农村合作金融
     
    关于我们 | 版权声明 | 网站地图 | 设为首页 | 加入收藏 | 诚邀合作 | 联系我们 | 会员注册 | 管理登录 |
    Copyright2004 www.ccffn.com All rights reserved 网管邮箱: 投稿邮箱:

    中国合作金融联合网版权所有  TEL:010-51171600   FAX:010-51171629  网管QQ:11943767

    通用网址:中国合作金融联合网 网络实名:中国合作金融联合网 京ICP备05001320号
    未经授权禁止复制或建立镜像