版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
动态gif图片实际是由多张图片组成的,本节将讲述如何从一张gif分解出对应的图片组。
主要用到的知识:
1、Image.FrameDimensionsList 属性:用于获取 GUID 的数组,这些 GUID 表示此 Image 中帧的维数。
2、FrameDimension 类:提供获取图像的框架维度的属性
属性:
Guid:获取表示此 FrameDimension 对象的全局唯一标识符 (GUID)。
Page(静态成员):获取页面维度。
Resolution(静态成员):获取分辨率维度。
Time(静态成员):获取时间维度。
通常gif对应的是时间维度,对应的Guid是 {6aedbd6d-3fb5-418a-83a6-7f45229dc872}
tif对应的是页面维度,对应的Guid是 {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
3、Image.GetFrameCount 方法:获得指定维度的帧数。
语法:Public Function GetFrameCount ( dimension As FrameDimension ) As Integer
返回:指定维度的帧数。
可以直接使用以下代码来获得时间维度的图片帧数量:
Image.GetFrameCount(Imaging.FrameDimension.Time)
4、Image.SelectActiveFrame 方法:对包含多个图像的图片,使指定维度和帧索引的帧成为当前活动帧。
语法:Public Function SelectActiveFrame ( dimension As FrameDimension, frameIndex As Integer ) As Integer
返回:始终返回 0。
5、Image.Save 方法:将此图像以指定的格式保存到指定的流中。
设计界面:
主要代码:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ofd As New OpenFileDialog
With ofd
.Title = "选择一个gif文件"
.Filter = "Gif文件|*.gif"
.Multiselect = False
If .ShowDialog() = DialogResult.OK Then
Label1.Text = .FileName
Else
Label1.Text = ""
End If
End With
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim fbd As New FolderBrowserDialog
With fbd
.Description = "选择Gif组图的输出目录"
.ShowNewFolderButton = True
If .ShowDialog() = DialogResult.OK Then
Label2.Text = .SelectedPath
End If
End With
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
If Label1.Text = "" Then Exit Sub
Dim bmp As New Bitmap(Label1.Text)
Dim filename As String = (New IO.FileInfo(Label1.Text)).Name
filename = filename.Substring(0, filename.Length - 4)
Dim folder As String = Label2.Text
If folder.Substring(folder.Length - 1, 1) = "\" Then folder = folder.Substring(0, folder.Length - 1)
For Each gd As Guid In bmp.FrameDimensionsList
Dim framecount As Integer
Dim fd As New System.Drawing.Imaging.FrameDimension(gd)
framecount = bmp.GetFrameCount(fd)
For i As Integer = 0 To framecount - 1
bmp.SelectActiveFrame(fd, i)
bmp.Save(folder & "\" & filename & "-" & i & ".jpg", Imaging.ImageFormat.Jpeg)
Next
Next
Label3.Text = "输出完成"
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Label2.Text = Application.StartupPath & "\imgs\img"
End Sub
如果不需要获取所有维度图片帧,那么“输出”按钮的代码还可以替换为:
If Label1.Text = "" Then Exit Sub
Dim bmp As New Bitmap(Label1.Text)
Dim filename As String = (New IO.FileInfo(Label1.Text)).Name
filename = filename.Substring(0, filename.Length - 4)
Dim folder As String = Label2.Text
If folder.Substring(folder.Length - 1, 1) = "\" Then folder = folder.Substring(0, folder.Length - 1)
Dim framecount As Integer
framecount = bmp.GetFrameCount(Imaging.FrameDimension.Time)
For i As Integer = 0 To framecount - 1
bmp.SelectActiveFrame(Imaging.FrameDimension.Time, i)
bmp.Save(folder & "\" & filename & "-" & i & ".jpg", Imaging.ImageFormat.Jpeg)
Next
Label3.Text = "输出完成"
或者:
If Label1.Text = "" Then Exit Sub
Dim bmp As New Bitmap(Label1.Text)
Dim filename As String = (New IO.FileInfo(Label1.Text)).Name
filename = filename.Substring(0, filename.Length - 4)
Dim folder As String = Label2.Text
If folder.Substring(folder.Length - 1, 1) = "\" Then folder = folder.Substring(0, folder.Length - 1)
Dim framecount As Integer
Dim fd As New System.Drawing.Imaging.FrameDimension(New Guid("{6aedbd6d-3fb5-418a-83a6-7f45229dc872}"))
framecount = bmp.GetFrameCount(fd)
For i As Integer = 0 To framecount - 1
bmp.SelectActiveFrame(fd, i)
bmp.Save(folder & "\" & filename & "-" & i & ".jpg", Imaging.ImageFormat.Jpeg)
Next
Label3.Text = "输出完成"
由于.net平台下C#和vb.Net很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录