版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 动态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 教程 目录