一、icon文件格式的简单介绍
windows的图标文件,其格式为ico。
windows的.net编程,自带Icon函数,可以利用Icon.Save来保存icon文件,其中稍微要注意的就是,icon文件的头文件格式。
Icon.save的参数为流数据即stream,所以,在你保存时,需要先把整个icon文件的流数据写出来,如果格式不对。或者头文件设置错误,生成出来的icon文件,可能会有错误或者bug,比如生成不了,或者即使能够生成,但图片不完整等等。
通常情况下,icon文件里面的图像数据,其格式可以是png或者bmp,或者gif都可以。常用的是bmp位图格式,也可以用png。
png格式下的程序参见:
https://blog.csdn.net/normer123456/article/details/125406662
但png格式的icon图标有个问题,经过测试,图像数据为png格式的icon文件,不能在windows应用程序的桌面快捷方式图标显示。
如果你想要用visual studio 自己写个桌面程序,然后添加自己的icon图标,这时候最好用图像数据格式为bmp的icon图标文件。
icon图标文件的数据格式为:
1、icon头文件
2、bmp数据
bmp数据又包括:
1、bmp信息头
2、bmp图像数据
其中,icon头文件22个字节,bmp信息头40个字节,bmp图像数据根据实际图片大小而定,通常和图片尺寸以及色彩位数有关,举例说明:
一张 256x256,32位色彩深度的图像数据大小为:256x256x4=262144 字节
如果色彩深度为24位,那么图像数据大小为:256x256x3=196608 字节
所谓色彩深度,即bits per pixel(比特每像素),一般有以下几种:
BitCount:1位(单色)
2位(4色,CGA)
4位(16色,VGA)
8位(256色)
16位(增强色)
24位(真彩色)
32位(真彩+透明度)
低于16位的图像,多了调色盘信息,其图像数据会变化:
一张256x256,8位色彩的图像数据大小为:256x256x1+1024=66560字节
一张256x256,4位色彩的图像数据大小为:256x256x0.5+64=32832字节
一张256*256,1位色彩的图像数据大小为:256x256x0.125+8=8200字节
1024=2的(8-1)次方x8
64=2的(4-1)次方x8
8=2的(1-1)次方x8
其对应关系大致如此,但其中的原理我还没搞清楚。
不过,基本上bmp图像数据不需要自己去算,可以利用Image类的save方法,直接转换为bmp格式,然后通过流数据,直接读取就行了。
之后对读取出来的流数据字节稍作处理即可。
二、程序实现
1、源图片读取:
Dim img As Image = New Bitmap(New Bitmap(src), size)
Dim bitmapstream As MemoryStream = New MemoryStream()
img.Save(bitmapstream, ImageFormat.Bmp) '将源图片保存为流数据,其格式为bmp
result = bitmapstream.ToArray() '将源图片字节数组存入缓存数组result()中
2、icon头文件写入:
'icon文件头数据写入
iconwriter.Write(CType(0, Int16)) '保留位
iconwriter.Write(CType(1, Int16)) '图片类型
iconwriter.Write(CType(1, Int16)) '图片张数
iconwriter.Write(CType(w, Byte)) 'icon尺寸为256时,值设为0即可,byte最大为255
iconwriter.Write(CType(h, Byte)) 'icon尺寸为256时,值设为0即可,byte最大为255
iconwriter.Write(CType(0, Int16)) '颜色深度
iconwriter.Write(CType(1, Int16)) 'colorplane
iconwriter.Write(CType(bitc, Int16)) 'bitcount
iconwriter.Write(CType(result.Length - 1 - 14 + 8192, Int32))
iconwriter.Write(CType(22, Int32))
3、图像数据写入流:
iconwriter.Write(result, 14, result.Length - 14) '总icon中,写入的bmp图像,不包括bmp头文件(14字节大小),从bmp信息头开始
4、icon流数据保存:
iconwriter.Flush()
iconwriter.Seek(0, SeekOrigin.Begin)
Dim iconfilestream As Stream = New FileStream(dest, FileMode.Create)
Dim icon As Icon = New Icon(iconstream)
icon.Save(iconfilestream)
5、资源释放:
iconfilestream.Dispose()
iconfilestream.Close()
iconwriter.Close()
iconstream.Close()
bitmapstream.Close()
icon.Dispose()
img.Dispose()
icon转换演示