C#实现合并多张图片为GIF动态图
作者:Csharp小记 发布时间:2022-12-13 04:16:35
标签:C#,合并,图片,gif
文章描述
在前一篇写了如何将一张GIF动态图分解成一帧一帧的图片,这一篇我们就把喝进去的一瓢水给还回去。即把一张又一张的图片去拼合成一张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;
}
实现效果
代码解析
看代码是不是又是挺简单的?又是几行代码?其实不然,这里使用到了一套开源的代码(AnimatedGif还是什么来着,年代有点久远,记不太清了,只知道代码里面是这么写的,应该根据这个关键词时可以搜索到的),不过也全是c#代码写的,但是太多就没放到文章中来。
在上一篇中,进行GIF动态图片分割的时候,可以看到对每一张图片保存命名的时候进行了编号,所以这里合成的时候,就要按照编号(帧)排序再合成(由于我命名时加了其他字符串,所以这里又用正则处理了下),这里注意一定不能乱排,否则图片播放器来不太连贯。当然你需求就是一张张无序播放的话,倒是无所谓。
来源:https://mp.weixin.qq.com/s/TaB-2CZBBXDmGFftRmFzkA


猜你喜欢
- 1. pom.xml文件配置<?xml version="1.0" encoding="UTF-8&qu
- zip 是一个非常常见的压缩包格式,本文主要用于说明如何使用代码 文件或文件夹压缩为 zip压缩包及其解压操作,我们采用的是 微软官方的实现
- Jmeter接口登录时获取到的参数token一直在变的问题,导致运行时总是报错解决方法如下:1.新建一个GET的HTTP请求2.添加正则表达
- 本文实例讲述了Android实现在屏幕上移动图片的方法。分享给大家供大家参考。具体实现方法如下:1. Speed.java文件:packag
- C#中+=是什么意思在C#中, "+="有两种运用场合。第一种,用在数值后面作为逻辑运算符,自加变量,如:int i=0
- 在项目中,我们要求做一个纸飞机的功能:就是当打开这个界面时,会有4架纸飞机从屏幕左侧飞入,然后到达自己的位置坐上下浮动,同时云彩也不断地从屏
- 同一个service调用service本身如果同一个service调用service本身的方法,出现了事务不能控制。解决方案1.在sprin
- 废话不多说了,直接给大家贴关键代码了。具体代码如下所示:using System;using System.Collections.Gene
- 网络办公正逐渐成为常态,无纸化办公也是一个潮流,这二者需要电子签章,最简单的方法就是在纸上盖一个章然后扫描成电子图片文件,最后在你的系统加载
- LockSupport 简介LockSupport 是 Java 并发编程中一个非常重要的组件,我们熟知的并发组件 Lock、线程池、Cou
- 使用maven引入jar<dependency> <groupId>com.itextpdf</g
- 前言牛顿摆大家应该都不陌生,也叫碰碰球、永动球(理论情况下),那么今天我们用Flutter实现这么一个理论中的永动球,可以作为加载Loadi
- 1、为什么使用缓存  我们知道内存的读取速度远大于硬盘的读取速度。当需要重复地获取相同数据时,一次一次地
- 概述一般我们在向文档添加水印时,会分为直接添加文字水印和加载图片添加图片水印两种情况。常见的,在添加文字水印时会多以声明文档版权、权威性的文
- 前言这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnim
- 正文:相关术语翻译说明:Mark,标记;Sweep,清除;Compact,整理; 也有人翻译为压缩,译者认为GC时不存在压缩这回事。Copy
- 这里说是框架,说的大了点,其实没有那么复杂,只是一个容易扩展的基类而已。不过至少算是框架类的代码。package arui; i
- Hook实现Android 微信、陌陌 、探探位置模拟 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的
- java解决动态配置字段需求是否在开发中遇到有像下图一样管理员配置多个字段让用户填写的需求我的实现方式是通过数据库存储动态json的显示实现
- 一. 简介 俩个数据库db1,db2, db1数据库的map