编辑: 笨蛋爱傻瓜悦 2019-07-06

255 Case 5, 6: c = d And 65535: pDAT(22) = d \ 65536: pDAT(21) = c \ 256: pDAT(20) = c And

255 End 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 +

40 +

1024 '

1024是256色调色板长度 Case 24: d = d +

40 End Select Select Case Len(Hex(d)) Case 1, 2: iDAT(14) = d Case 3, 4: iDAT(15) = d \ 256: iDAT(14) = d And

255 Case 5, 6: c = d And 65535: iDAT(16) = d \ 65536: iDAT(15) = c \ 256: iDAT(14) = c And

255 End Select Command3.Enabled = True: Command2.Enabled = False

100 End Sub Private Sub Command1_Click() On Error GoTo ReadErr Dim ImageName As String, fLength As Long, BJ As Boolean With CommonDialog1 .DialogTitle = 打开 .Filter = 图片文件(*.bmp,*.jpg,*.gif)|*.bmp;

*.jpg;

*.gif .ShowOpen If Len(.FileName) <

5 Then Exit Sub ImageName = .FileName End With Picture1.Picture = LoadPicture(ImageName) Picture2.Width = Picture1.Width: Picture2.Height = Picture1.Height Picture2.Picture = LoadPicture() If Right(LCase(ImageName), 3) bmp Then '

如果不是位图,先存为位图,再读取 BJ = True ImageName = App.Path &

\TempFile.bmp SavePicture Picture1.Image, ImageName End If fLength = FileLen(ImageName) '

获取文件长度 ReDim pDAT(fLength - 15) As Byte Open ImageName For Binary As #1 Get #1, 15, pDAT Close If BJ Then Kill ImageName '

删除临时位图文件 If (pDAT(5) + pDAT(6) + pDAT(7) + pDAT(9) + pDAT(10) + pDAT(11) >

0) Then MsgBox 图片尺寸超出 Exit Sub End If Me.Caption = ImageName Command2.Enabled = True Exit Sub ReadErr: Close End Sub Private Sub Command3_Click() On Error GoTo WriteErr Dim IconName As String With CommonDialog1 .Flags = &

H802 .DialogTitle = 保存 .Filter = 图标文件(*.ico)|*.ico .ShowSave If .FileName = Then Exit Sub IconName = .FileName End With Open IconName For Binary As #1 Put #1, , iDAT Put #1, , pDAT Put #1, , aDAT Close ReDim iDAT(0) ReDim pDAT(0) ReDim aDAT(0) Command3.Enabled = False Picture2.Picture = LoadPicture(IconName) Exit Sub WriteErr: Close MsgBox 图标制作失败 End Sub 3.代码分析 ①在Command1_Click 过程中,使用二进制读入数据方法,从第15字节读起,这样就去掉了 BMP文件头. ②在Command3_Click 过程中,使用二进制写入数据方法,将ICON文件头、ICON图象信息块 、读入的位图数据(修改了其中几个字节的数据)、AND位图数据(全0数据)等,依次写入一 个ico文件 ③Command2_Click 过程是本代码关键的关键. 首先计算 AND位图的长度.这就需要知道扫描线的长度和图象的高度,而计算扫描线长度 还需知道图像的宽度.本代码中,图像高度在原位图数据的 pDAT(8)元素中,图象宽度在原位 图数据的 pDAT(4) 元素中,所以可归纳成代码中所示的计算公式. 接着给 ICON文件头和 ICON图象信息块的元素赋值.请注意 iDAT(6)和iDAT(7),它们 分别是图标的宽度和高度,由于它们都只占用 1个字节,故图标规格的最大值只能做到

255 象素(如果它们都分别占用

4 个字节的话,呵呵,那制作出来的图标是多么地惊人啊!). icon 图像信息块中的图象长度数据元素 iDAT(14)―iDAT(17)要最后才赋值. 接下来就是更改BMP信息头中的图像高度数据.原元素中只是XOR位图的高度,而图标的 数据结构要求这个值是XOR位图高度与AND位图高度之和. 再修改 BMP信息头中的图象长度数据.原元素中只是 XOR位图的长度,而图标的数据结 构要求这个值是 XOR位图长度与 AND位图长度之和. 最后修改 icon 图像信息块中的图象长度数据,也就是 iDAT(14)―iDAT(17) 元素的值 (这个长度数据本来占用 4个字节,但255*255象素的图标长度只要 3个字节就够了).计 算公式如下: icon图像信息块中的图象长度=XOR位图长度+AND位图长度+BMP信息头长度+调色板长度 特大图标的制作工作到此就全部结束了,你一定迫不及待地想看看它的效果吧,可惜的 是,不论多大的图标,........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题