ico文件的数据结构

上传人:xmg****18 文档编号:121223359 上传时间:2020-02-19 格式:DOC 页数:23 大小:80.50KB
返回 下载 相关 举报
ico文件的数据结构_第1页
第1页 / 共23页
ico文件的数据结构_第2页
第2页 / 共23页
ico文件的数据结构_第3页
第3页 / 共23页
ico文件的数据结构_第4页
第4页 / 共23页
ico文件的数据结构_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《ico文件的数据结构》由会员分享,可在线阅读,更多相关《ico文件的数据结构(23页珍藏版)》请在金锄头文库上搜索。

1、.专业整理.1.制造原理调色板模式的ico文件的数据结构,可分为 6 部分:1.ICON文件头(6字节)2.ICON图象信息块(16字节)3.BMP信息头(40字节)4.调色板(16色为64字节,256色为1024字节)5.XOR位图6.AND位图而调色板模式的bmp文件的数据结构可分为 4 部分:1.BMP文件头(14字节)2.BMP信息头(40字节)3.调色板(16色为64字节,256色为1024字节)4.XOR位图分析可知,ico图标与bmp位图有三个相同的部分(注:真彩图标与真彩位图的数据结构均没有调色板部分,所以是两个相同的部分),而且这三个部分是最重要的部分。因此,我们只要去掉 b

2、mp位图的 BMP文件头,再加上ICON文件头、ICON图象信息块和AND位图,就可以轻松制作出255255象素以内的任何规格的图标了。然而且慢,有一点却是很不轻松的:如果你想制作背景透明(屏蔽背景色)的图标,那么你还需要对 XOR位图的数据动大手术,更不轻松的是,AND 位图的数据也必须符合相应的要求,这是相当困难的;而制作有背景色的图标的话,XOR 位图部分我们可以原封不动,AND 位图全是 0,只要计算出它的长度来即可添加到 XOR位图数据的后面,这是很容易实现的。所以,下面我所讲的,都是制作有背景色的图标。ICON文件头结构很简单,一共只有3个数据共6个字节,我们要给其中的“资源类型”

3、和“图象个数” 2个数据均赋值为 1。ICON 图象信息块有 7个数据共16字节,有5个数据要赋值:图标宽度、图标高度、颜色计数、图像数据块的长度、图象数据块相对于文件头部的偏移量。要赋值的 5个数据中,图象数据块相对于文件头部的偏移量是固定的,图像数据块的长度需要计算,其余 3个数据可从 BMP 信息头中获得资料。AND 位图的长度必须根据从 BMP 信息头中获得的有关数据计算。此外,还要更改 BMP 信息头中的 2个数据:一个是图象长度数据(要加上 AND 位图的长度),另一个是图像高度数据(这只要简单地将原数据2即可)。OK,一切都准备好了,万事俱备,只欠东风,下面就让东风劲吹吧。2.编

4、程新建一个窗体,添加一个公用对话框,两个图片框,三个按纽。窗体与图片框的ScaleMode属性均设为3,其中 Picture1 的 Autosize 属性设为 Ture。按纽的属性设置:Command1:Caption=打开图片Command2:Caption=数据处理,Enabled=FalseCommand3:Caption=保存图标,Enabled=False代码如下:Option ExplicitDim pDAT() As Byte 源图数据Dim aDAT() As Byte AND位图数据Dim iDAT() As Byte icon文件头和图象信息块数据Private Sub C

5、ommand2_Click()On Error GoTo 100Dim d As Long, c As LongDim aLength As Long AND位图长度aLength = 4 * (pDAT(4) 32 + Abs(pDAT(4) Mod 32) 0) * pDAT(8) 计算AND位图的长度ReDim aDAT(aLength - 1) As ByteReDim iDAT(21) As Byte给 icon文件头和 icon图象信息块的元素赋值iDAT(2) = 1 资源类型iDAT(4) = 1 图像个数iDAT(6) = pDAT(4) 图像宽iDAT(7) = pDAT(

6、8) 图像高iDAT(8) = 16 * Abs(pDAT(14) = 4)iDAT(18) = 22 图象数据块相对于文件头部的偏移量更改BMP信息头中的图像高度数据d = 2 * pDAT(8)Select Case Len(Hex(d)Case 1, 2: pDAT(8) = dCase 3, 4: pDAT(9) = d 256: pDAT(8) = d And 255End Select更改BMP信息头中的图象长度数据c = pDAT(21): d = pDAT(20) + c * 256 + pDAT(22) * 65536 + aLengthSelect Case Len(Hex

7、(d) Case 1, 2: pDAT(20) = dCase 3, 4: pDAT(21) = d 256: pDAT(20) = d And 255Case 5, 6: c = d And 65535: pDAT(22) = d 65536: pDAT(21) = c 256: pDAT(20) = c And 255End Select计算icon图像信息块中的图象长度数据Select Case pDAT(14) pDAT(14)4为16色,8为256色,24为真彩Case 4: d = d + 40 + 64 64是16色调色板长度,40是BMP信息头的长度Case 8: d = d

8、+ 40 + 1024 1024是256色调色板长度Case 24: d = d + 40End SelectSelect Case Len(Hex(d)Case 1, 2: iDAT(14) = dCase 3, 4: iDAT(15) = d 256: iDAT(14) = d And 255Case 5, 6: c = d And 65535: iDAT(16) = d 65536: iDAT(15) = c 256: iDAT(14) = c And 255End SelectCommand3.Enabled = True: Command2.Enabled = False100End

9、 SubPrivate Sub Command1_Click()On Error GoTo ReadErrDim ImageName As String, fLength As Long, BJ As BooleanWith CommonDialog1.DialogTitle = 打开.Filter = 图片文件(*.bmp,*.jpg,*.gif)|*.bmp;*.jpg;*.gif.ShowOpenIf Len(.FileName) 5 Then Exit SubImageName = .FileNameEnd WithPicture1.Picture = LoadPicture(Imag

10、eName)Picture2.Width = Picture1.Width: Picture2.Height = Picture1.HeightPicture2.Picture = LoadPicture()If Right(LCase(ImageName), 3) bmp Then 如果不是位图,先存为位图,再读取BJ = TrueImageName = App.Path & TempFile.bmpSavePicture Picture1.Image, ImageNameEnd IffLength = FileLen(ImageName) 获取文件长度ReDim pDAT(fLength

11、- 15) As ByteOpen ImageName For Binary As #1Get #1, 15, pDATCloseIf BJ Then Kill ImageName 删除临时位图文件If (pDAT(5) + pDAT(6) + pDAT(7) + pDAT(9) + pDAT(10) + pDAT(11) 0) ThenMsgBox 图片尺寸超出Exit SubEnd IfMe.Caption = ImageNameCommand2.Enabled = TrueExit SubReadErr:CloseEnd SubPrivate Sub Command3_Click()On

12、 Error GoTo WriteErrDim IconName As StringWith CommonDialog1.Flags = &H802.DialogTitle = 保存.Filter = 图标文件(*.ico)|*.ico.ShowSaveIf .FileName = Then Exit SubIconName = .FileNameEnd WithOpen IconName For Binary As #1Put #1, , iDATPut #1, , pDATPut #1, , aDATCloseReDim iDAT(0)ReDim pDAT(0)ReDim aDAT(0)C

13、ommand3.Enabled = FalsePicture2.Picture = LoadPicture(IconName)Exit SubWriteErr:CloseMsgBox 图标制作失败End Sub3.代码分析在 Command1_Click 过程中,使用二进制读入数据方法,从第15字节读起,这样就去掉了BMP文件头。在 Command3_Click 过程中,使用二进制写入数据方法,将ICON文件头、ICON图象信息块、读入的位图数据(修改了其中几个字节的数据)、AND位图数据(全0数据)等,依次写入一个ico文件Command2_Click 过程是本代码关键的关键。首先计算 AN

14、D位图的长度。这就需要知道扫描线的长度和图象的高度,而计算扫描线长度还需知道图像的宽度。本代码中,图像高度在原位图数据的 pDAT(8)元素中,图象宽度在原位图数据的 pDAT(4) 元素中,所以可归纳成代码中所示的计算公式。接着给 ICON文件头和 ICON图象信息块的元素赋值。请注意 iDAT(6)和 iDAT(7),它们分别是图标的宽度和高度,由于它们都只占用 1个字节,故图标规格的最大值只能做到 255象素(如果它们都分别占用 4 个字节的话,呵呵,那制作出来的图标是多么地惊人啊!)。icon 图像信息块中的图象长度数据元素 iDAT(14)iDAT(17)要最后才赋值。接下来就是更改

15、BMP信息头中的图像高度数据。原元素中只是XOR位图的高度,而图标的数据结构要求这个值是XOR位图高度与AND位图高度之和。再修改 BMP信息头中的图象长度数据。原元素中只是 XOR位图的长度,而图标的数据结构要求这个值是 XOR位图长度与 AND位图长度之和。最后修改 icon 图像信息块中的图象长度数据,也就是 iDAT(14)iDAT(17) 元素的值(这个长度数据本来占用 4个字节,但255255象素的图标长度只要 3个字节就够了)。计算公式如下:icon图像信息块中的图象长度XOR位图长度AND位图长度BMP信息头长度调色板长度特大图标的制作工作到此就全部结束了,你一定迫不及待地想看看它的效果吧,可惜的是,不论多大的图标,在桌面或资源管理器中最大都只能显示

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号