vb.net 教程 5-17 分解动态gif图片

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

动态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 教程 目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值