vb.net下,生成icon图标文件,图像格式为bmp,可用作windows应用的桌面快捷方式图标

一、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()

程序界面:
vb.net下,生成icon图标文件,图像格式为bmp,可用作windows应用的桌面快捷方式图标_第1张图片
演示:

icon转换演示

你可能感兴趣的:(VB.net实例应用,.net,visaul,studio,icon)