当前位置:网站首页>使用VB.net将PNG图片转成icon类型图标文件
使用VB.net将PNG图片转成icon类型图标文件
2022-07-01 23:35:00 【机构师】
有的时候,需要用到icon图标型图片,但一般网站上不好找到适合自己的icon型图片,所以,如果能将适合的图片直接转换成icon格式,那么会方便很多。
使用vb.net,可以自己编写一个转换的小程序,这样,需要icon格式的时候,直接转换一下就行了。
程序:
01 建立中间存储流
Dim image As Image = New Bitmap(New Bitmap(ori), size) '读取源图片为bitmap,缩放至需要的大小
Dim bitmapstream As MemoryStream = New MemoryStream() '源图片的内存流
Dim iconstream As MemoryStream = New MemoryStream() 'ico图片的内存流
image.Save(bitmapstream, ImageFormat.Png) '源图片读取为设定格式并存入源图片内存流
Dim iconwriter As BinaryWriter = New BinaryWriter(iconstream) '新建二进制写入器,写入目标ico图片内存流
02 在流中写入头文件(这里应该是固定格式)
iconwriter.Write(Convert.ToInt16(0))
iconwriter.Write(Convert.ToInt16(1))
iconwriter.Write(Convert.ToInt16(1))
iconwriter.Write(Convert.ToByte(image.Width))
iconwriter.Write(Convert.ToByte(image.Height))
iconwriter.Write(Convert.ToInt16(0))
iconwriter.Write(Convert.ToInt16(0))
iconwriter.Write(Convert.ToInt16(32))
iconwriter.Write(Convert.ToInt32(bitmapstream.Length))
iconwriter.Write(22)
03 写入并保存icon图片信息
'将源图片写入目标ico图标内存流
iconwriter.Write(bitmapstream.ToArray())
'保存流,并将流指针定位至头部,以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)
04 释放资源
'资源释放
iconFileStream.Close()
iconwriter.Close()
iconstream.Close()
bitmapstream.Close()
icon.Dispose()
image.Dispose()
上面是转换程序的关键代码,实际使用时,需要自己添加一下UI界面,方面操作。
完整程序:
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports System.Text
'Imports png_to_icon
Public Class Form5
Dim orifilename As String
Dim destfilename As String
Dim imgfmt As ImageFormat
Private Sub Form5_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
Label1.Text = OpenFileDialog1.FileName
orifilename = OpenFileDialog1.FileName
End If
Dim a As String()
a = orifilename.Split(".")
Label2.Text = a(a.Length - 1)
End Sub
Private Sub p_to_ico(ori As String, dest As String, imgfmt As ImageFormat, size As Size)
If size.Width > 255 Or size.Height > 255 Then
MsgBox("ico图片尺寸超过范围", MsgBoxStyle.Exclamation, "警告消息!")
Exit Sub
End If
Dim image As Image = New Bitmap(New Bitmap(ori), size) '读取源图片为bitmap,缩放至需要的大小
Dim bitmapstream As MemoryStream = New MemoryStream() '源图片的内存流
Dim iconstream As MemoryStream = New MemoryStream() 'ico图片的内存流
image.Save(bitmapstream, ImageFormat.Png) '源图片读取为设定格式并存入源图片内存流
Dim iconwriter As BinaryWriter = New BinaryWriter(iconstream) '新建二进制写入器,写入目标ico图片内存流
'根据原图信息,进行头文件写入
iconwriter.Write(Convert.ToInt16(0))
iconwriter.Write(Convert.ToInt16(1))
iconwriter.Write(Convert.ToInt16(1))
iconwriter.Write(Convert.ToByte(image.Width))
iconwriter.Write(Convert.ToByte(image.Height))
iconwriter.Write(Convert.ToInt16(0))
iconwriter.Write(Convert.ToInt16(0))
iconwriter.Write(Convert.ToInt16(32))
iconwriter.Write(Convert.ToInt32(bitmapstream.Length))
iconwriter.Write(22)
'将源图片写入目标ico图标内存流
iconwriter.Write(bitmapstream.ToArray())
'保存流,并将流指针定位至头部,以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)
ProgressBar1.Maximum = iconFileStream.Length
ProgressBar1.Value = iconFileStream.Length
'资源释放
iconFileStream.Close()
iconwriter.Close()
iconstream.Close()
bitmapstream.Close()
icon.Dispose()
image.Dispose()
'Return File.Exists(dest)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
SaveFileDialog1.Filter = "txt files (*.txt)|*.txt|ico files (*.ico)|*.ico|All files (*.*)|*.*"
SaveFileDialog1.FilterIndex = 2
SaveFileDialog1.RestoreDirectory = True
If SaveFileDialog1.ShowDialog = DialogResult.OK Then
Label3.Text = SaveFileDialog1.FileName
destfilename = SaveFileDialog1.FileName
End If
Dim a As String()
a = destfilename.Split(".")
Label7.Text = a(a.Length - 1)
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim a As String
a = Label2.Text
If a = "png" Or a = "Png" Then
imgfmt = ImageFormat.Png
ElseIf a = "bmp" Or a = "Bmp" Then
imgfmt = ImageFormat.Bmp
ElseIf a = "jpeg" Or a = "Jpeg" Or a = "jpg" Then
imgfmt = ImageFormat.Jpeg
End If
' destfilename = "C:\Users\rongjv\Desktop\tt11.ico"
' btoico.p_to_ico.ctoico(orifilename, destfilename, New Size(128, 128))
p_to_ico(orifilename, destfilename, imgfmt, New Size(128, 128))
End Sub
End Class
界面:
界面比较简单,以实现功能为主。
边栏推荐
- Notes to problems - file /usr/share/mysql/charsets/readme from install of mysql-server-5.1.73-1 glibc23.x86_ 64 c
- Leetcode (34) -- find the first and last positions of elements in a sorted array
- PostgreSQL notes (10) dynamically execute syntax parsing process
- ShanDong Multi-University Training #3
- Practical application and extension of plain framework
- JS - use of arguments
- Behind sharing e-commerce: the spirit of CO creation, symbiosis, sharing, CO prosperity and win-win
- 【必会】BM41 输出二叉树的右视图【中等+】
- De PIP. Interne. CLI. Main Import main modulenotfounderror: No module named 'PIP'
- The essence of software architecture
猜你喜欢
What category does the Internet of things application technology major belong to
Linux foundation - centos7 offline installation of MySQL
使用uni-simple-router,动态传参 TypeError: Cannot convert undefined or null to object
PostgreSQL source code (57) why is the performance gap so large in hot update?
Matplotlib common charts
软件架构的本质
Commemorate becoming the first dayus200 tripartite demo contributor
Practical application and extension of plain framework
为什么PHP叫超文本预处理器
Redis master-slave synchronization
随机推荐
神经网络物联网的发展趋势和未来方向
Commemorate becoming the first dayus200 tripartite demo contributor
Distance measurement - Hamming distance
门级建模—课后习题
2022-07-01:某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分, 他们需要排成一队,在队伍最前面的一定是老板
股票开户哪个证券公司最好,有安全保障吗
2021 RoboCom 世界机器人开发者大赛-高职组复赛
Li Kou today's question -241 Design priorities for operational expressions
Who do you want to know when opening a stock account? Is it safe to open an account online?
Typescript enumeration
软件架构的本质
PostgreSQL source code (58) tuple splicing heap_ form_ Tuple analysis
URL introduction
JPA handwritten SQL, received with user-defined entity classes
De PIP. Interne. CLI. Main Import main modulenotfounderror: No module named 'PIP'
Windows 7 安装MYSQL 错误:1067
使用 pair 做 unordered_map 的键值
JS - use of arguments
SWT / anr problem - SWT causes kernel fuse deadlock
Redis AOF日志