2024年5月8日发(作者:)

32×32的24位bmp位图转换为24位ico图标

2009年03月03日 星期二 10:25

不需任何控件和外部函数,单击窗体,输入bmp文件名和ico文件名就完成了,如果输入的文件名

错误,将取消转换

Private Sub Form_Click()

On Error GoTo cancel

icoHead = Array(0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 24, 0, 168, 12, 0, 0, 22, 0, 0,

_

0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 128,

12)

Dim bmp(3125) As Byte, ico(3261) As Byte

begin:

bmpfile = InputBox("请输入要转换的bmp文件名(全路径)")

n = FileLen(bmpfile)

Open bmpfile For Binary As #1

Get #1, , bmp

Close #1

If bmp(18) <> 32 Or bmp(22) <> 32 Or n <> 3126 Then

m2 = MsgBox("文件不是32×32的24位位图,是否重新选择?", vbYesNo + 32)

If m2 = vbNo Then GoTo cancel

GoTo begin

End If

For i = 0 To 43

ico(i) = icoHead(i)

Next i

For i = 62 To 3133

ico(i) = bmp(i - 8)

Next i

AutoRedraw = True

ScaleMode = 3

Picture = LoadPicture(bmpfile) '在窗体上显示位图文件

For y = 31 To 0 Step -1

For x = 0 To 31 Step 8

For b = 0 To 7

ico(i) = ico(i) + 2 ^ (7 - b) * (-(Point(x + b, y) = RGB(192, 192, 192)))

'把位图中颜色为RGB(192,192,192)的像素转换为透明

Next b

i = i + 1

Next x

Next y

icofile = InputBox("请输入要保存的ico文件名(全路径)")

Open icofile For Binary As #1

Put #1, , ico

Close #1

MsgBox "32×32的24位位图" & vbCrLf & bmpfile & vbCrLf & _

"已成功转换为24位图标" & vbCrLf & icofile, 64

MousePointer = 99 '这两句把转换成的图标作为窗体的鼠标图标,以查看效果

MouseIcon = LoadPicture(icofile)

Exit Sub

cancel:

MsgBox "转换被取消", 64

End Sub

转换原理:

宽和高都不小于4的24位位图,文件的前36个字节(第0~35字节)是24位位图的标记,其

中第15~18字节记录着图片的宽度,第19~22字节记录着图片的高度,设首字节为第0字节,第i

字节的值为bmp(i),则对于宽和高都小于65536的24位位图,宽=bmp(17)*256+bmp(18),高

=bmp(21)*256+bmp(22),第36~53这18个字节不影响图片效果,文件的第54字节往后,每3个字

节(24位)对应一个像素,所以文件大小为(54+宽*高*3)字节.32×32的24位位图文件大小为

3126字节(记为第0~3125字节),前36个字节是

66,77,54,12,0,0,0,0,0,0,54,0,0,0,40,0,0,0,32,0,0,0,32,0,0,0,1,0,24,0,0,0,0,0,0,12

32×32的24位ico图标文件至少3262字节(记为第0~3261字节),前44个字节(第0~43

字节)是32×32的24位ico图标的标记,第44~61这18个字节不影响图标效果,第62~3133这

3072个字节(3072*8=32*32*24)每3个字节(24位)对应一个像素,记录着所有像素的颜色,这与

32×32的24位位图的第54~3125字节的对应规则一致,第3134~3261这128字节(1024

位,128*8=32*32)每位对应一个像素,记录着每个像素是否透明,如果某个像素在这128字节中对

应的那一位是1,表示该像素透明,是0则表示不透明.32×32的24位ico图标的前44个字节是

0,0,1,0,1,0,32,32,0,0,1,0,24,0,168,12,0,0,22,0,0,0,

40,0,0,0,32,0,0,0,64,0,0,0,1,0,24,0,0,0,0,0,128,12