C#实现合并多张图片为GIF动态图

作者:Csharp小记 时间:2022-12-13 04:16:35 

文章描述

在前一篇写了如何将一张GIF动态图分解成一帧一帧的图片,这一篇我们就把喝进去的一瓢水给还回去。即把一张又一张的图片去拼合成一张GIF动态图。

这里我们使用的是上一篇分割下来的每一帧图片,然后来进行一个还原操作,其实下面的代码中,能做到也不仅仅是还原,还可以同时设置延迟间隔等一些属性,也就是对这张动态图进行慢放或者快放的操作。

C#实现合并多张图片为GIF动态图

开发环境

.NET Framework版本:4.5

开发工具

 Visual Studio 2013

实现代码

string newPath = Application.StartupPath + "\\new.gif";
       public Form1()
       {
           InitializeComponent();
           textBox1.Text = Application.StartupPath + "\\images\\";
       }

private void btn_merge_Click(object sender, EventArgs e)
       {
           List<string> imgs = Directory.GetFiles(textBox1.Text, "*.jpg").ToList();
           imgs.Sort((a, b) =>
           {
               string reg = "[0-9]+";
               int a_index = int.Parse(Regex.Match(a, reg).Value);
               int b_index = int.Parse(Regex.Match(b, reg).Value);
               return a_index > b_index ? 1 : a_index < b_index ? -1 : 0;
           });
           AnimatedGifEncoder ae = new AnimatedGifEncoder();
           ae.Start(newPath);
           ae.SetDelay(120);   // 延迟间隔
           ae.SetRepeat(0);  //-1:不循环,0:循环播放
           for (int i = 0; i < imgs.Count; i++)
           {
               ae.AddFrame(Image.FromFile(imgs[i]));
           }
           ae.Finish();
           MessageBox.Show("处理完成,请点击预览查看");
       }

private void btn_preview_Click(object sender, EventArgs e)
       {
           Image img = Image.FromFile(newPath);
           lb_img.Image = img;
       }

实现效果

C#实现合并多张图片为GIF动态图

代码解析

看代码是不是又是挺简单的?又是几行代码?其实不然,这里使用到了一套开源的代码(AnimatedGif还是什么来着,年代有点久远,记不太清了,只知道代码里面是这么写的,应该根据这个关键词时可以搜索到的),不过也全是c#代码写的,但是太多就没放到文章中来。

在上一篇中,进行GIF动态图片分割的时候,可以看到对每一张图片保存命名的时候进行了编号,所以这里合成的时候,就要按照编号(帧)排序再合成(由于我命名时加了其他字符串,所以这里又用正则处理了下),这里注意一定不能乱排,否则图片播放器来不太连贯。当然你需求就是一张张无序播放的话,倒是无所谓。

来源:https://mp.weixin.qq.com/s/TaB-2CZBBXDmGFftRmFzkA

标签:C#,合并,图片,gif
0
投稿

猜你喜欢

  • Java设计模式之动态代理模式实例分析

    2022-07-07 17:55:07
  • Android编程实现TextView部分颜色变动的方法

    2021-05-29 15:12:23
  • Android图片翻转动画简易实现代码

    2023-03-12 02:33:35
  • SpringBoot整合Mybatis与druid实现流程详解

    2022-09-17 17:05:31
  • Android录音时获取分贝值的方法代码实例

    2022-03-03 04:15:12
  • Java8深入学习之熟透Optional

    2023-08-24 21:27:54
  • Java中list.contains()的用法及拓展

    2022-11-06 21:04:59
  • 一场由Java中Integer引发的踩坑实战

    2021-09-06 11:14:40
  • SpringBoot自动配置实现流程详细分析

    2023-06-23 13:35:45
  • Android Jetpack库剖析之LiveData组件篇

    2022-08-31 02:08:13
  • Spring之IOC详解

    2022-10-13 19:10:24
  • 关于JWT之token令牌认证登录

    2022-03-16 07:32:58
  • 基于spring中的aop简单实例讲解

    2023-10-16 21:01:10
  • 通过FancyView提供 Android 酷炫的开屏动画实例代码

    2023-04-11 11:00:53
  • 一起来学习C#的观察者模式

    2022-04-02 13:43:15
  • Java超详细讲解抽象类的原理与用法

    2022-10-31 20:51:42
  • 在Winform框架界面中改变并存储界面皮肤样式的方法

    2021-06-08 09:08:24
  • 使用cmd根据WSDL网址生成java客户端代码的实现

    2022-09-12 11:00:20
  • Android 实现定时器的四种方式总结及实现实例

    2023-04-20 15:22:04
  • SpringBoot Entity中枚举类型详细使用介绍

    2023-11-11 00:30:52
  • asp之家 软件编程 m.aspxhome.com