Gift动图分解小工具
gif 动图分解小工具
Overview
因为自己有时候需要将一些gif图片分解,但是没有在网上找到合适的工具,所有就自己写了一个,在这里与大家分享,其实实现很简单,是通过C#实现的。文章下方有下载链接!
效果图
分解的图片为:
分解后
实现代码
/*
GIF分解小工具
作者 鲁迅认识的那只猹
联系方式: 1258730808@qq.com
创建时间: 2017-8-14 09:59:28
编辑历史:
2018年3月13日14:56:40 将jpg的导出格式改为了png的导出格式
*/
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using System.Windows.Forms;
namespace GIFTools
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
//禁止改变窗体大小
this.MaximumSize = this.MinimumSize;
//取消跨线程的检查
Control.CheckForIllegalCrossThreadCalls = false;
}
/// <summary>
/// 选择要进行分解的gif图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGifBorrow_Click(object sender, EventArgs e)
{
using (OpenFileDialog dialog = new OpenFileDialog())
{
dialog.Filter = "GIF图片|*.gif";
dialog.Multiselect = false;
if (dialog.ShowDialog() == DialogResult.OK)
{
string path = dialog.FileName;
tbGifPath.Text = path;
}
}
}
/// <summary>
/// 选择导出图片的文件夹
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExportBorrow_Click(object sender, EventArgs e)
{
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
{
dialog.ShowNewFolderButton = true;
if (dialog.ShowDialog() == DialogResult.OK)
{
string path = dialog.SelectedPath;
this.tbExportPath.Text = path;
}
}
}
/// <summary>
/// 导出文件按钮的点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExport_Click(object sender, EventArgs e)
{
string gifPath = tbGifPath.Text.Trim();
string folderPaht = tbExportPath.Text.Trim();
if (string.IsNullOrEmpty(gifPath) || string.IsNullOrEmpty(folderPaht))
{
MessageBox.Show("请选择gif路径或者导出路径!");
return;
}
if (btnExport.Text == "导出文件")
{
btnExport.Text = "导出中...";
//开启线程导出图片
Thread thread = new Thread(Export);
thread.Start();
}
else
{
MessageBox.Show("正在导出中!");
return;
}
}
/// <summary>
/// 导出jpg图片
/// </summary>
private void Export()
{
string gifPath = tbGifPath.Text.Trim();
string folderPaht = tbExportPath.Text.Trim();
Image img = Image.FromFile(gifPath);
FrameDimension fd = new FrameDimension(img.FrameDimensionsList[0]);
//获取gif帧的数量
int count = img.GetFrameCount(fd);
//遍历保存图片
for (int i = 0; i < count; i++)
{
img.SelectActiveFrame(fd, i);
string imgPath = folderPaht + "\\frame" + (i + 1) + ".png";
//判断同名文件是否存在
if (File.Exists(imgPath))
{
File.Delete(imgPath);
}
//保存图片 一定要设置格式 否则保存出来的图片都是一张图片
img.Save(imgPath, ImageFormat.Png);
}
MessageBox.Show("文件导出成功!");
btnExport.Text = "导出文件";
}
}
}
源码下载
下面是下载链接,其中也包括了可执行的文件
https://files.cnblogs.com/files/slyfox/GIF分解工具.rar
Gift动图分解小工具的更多相关文章
- js将用户上传gif动图分解成多张帧图片
js将用户上传gif动图分解成多张帧图片 写在前面 工作中遇到一个这么一个需求:这是一个多图上传的场景,如果用户上传选择多张图片,则上传后直接展示多张图片,如果上传的图片是gif动图,则需要分解这张动 ...
- 用户上传gif动图分解成多张帧图片,并合并生成新gif图片
背景 为什么要制作这么一款工具 首先公司最近在做一款表情包的产品,需要将文字生成到gif图片中,并可以控制文字显示的位置,并将不同的文字显示在不同的图片上 制作成网页端工具,随时随地,方便使用 探索 ...
- java 图形化小工具Abstract Window Toolit
老掉牙的历史 Java1.0在发布的时候,就为我们提供了GUI操作的库,这个库系统在所有的平台下都可以运行,这套基本的类库被称作抽象窗口工具集(Abstract Window Toolit),简称 ...
- java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图. Graphics常用的画图方法如下: drawLine(): ...
- java 图形化小工具Abstract Window Toolit 事件处理
事件处理设计到了三个对象: EventSource(事件源):事件发生的场所,通常就是各个组件,例如按钮.窗口,菜单等. Event (事件封装了GUI组件上发生的特定事情(通常就是一次用户操作).如 ...
- java 图形化小工具Abstract Window Toolit ImageIO缩放图片,添加水印
实现步骤: 读取图像Image src = ImageIO.read 创建目标图像BufferedImage distImage = new BufferedImage(dstWidth, dstHe ...
- java 图形化小工具Abstract Window Toolit 画笔 处理位图
具体编程来处理位图 知识点: 实现逻辑: 画板上的图片 new BufferedImage(canvasWidth,canvasHeight,BufferedImage.TYPE_INT_BGR); ...
- java 图形化小工具Abstract Window Toolit 菜单项
AWT 中的菜单由如下几个类组合而成 MenuBar: 菜单条,菜单的容器. Menu: 菜单组件,菜单项的容器,它也是Menultem的子类,所以可作为菜单项使用. PopupMenu: 上下文菜单 ...
- java 图形化小工具Abstract Window Toolit 常用组件:对话框Dialog FileDialog
对话框 Dialog是Window类的子类,是1个容器类,属于特殊组件,对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎完全一样.但对话框有如下两点需要注意. (1),对话框通常依赖于其他 ...
随机推荐
- scrapy 让指定的spider执行指定的pipeline
处理scrapy中包括多个pipeline时如何让spider执行制定的pipeline管道1:创建一个装饰器from scrapy.exceptions import DropItemimport ...
- react入门-refs
vue有ref来获取template里面的子组件/子元素,react当然也有: <!DOCTYPE html> <html lang="en"> <h ...
- python教程2:list和tuple
list和tuple都是数组,区别在于list可以随意增删改查,而tuple在赋值了之后只能查看了,所以tuple是比较安全的相对于list来说 list 定义一个list数组,名字就叫list,可以 ...
- bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖
http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解去看它 http://www.cnblogs.com/TheRoadToTheGold/p ...
- 一些javascript的工具书
http://pan.baidu.com/s/1jGj9CvO
- [整理]zepto的初次使用
http://www.css88.com/doc/zeptojs_api/ http://chaoskeh.com/blog/some-experience-of-using-zepto.html
- [原]Android 初遇Http错误 httpClient.execute
错误源头: HttpResponse response = httpClient.execute(httpget); 错误信息: android.os.NetworkOnMainThreadExcep ...
- [百度地图] 用于类似 DWZ UI 框架的 百度地图 功能封装类 [MultiZMap.js] 实例源码
MultiZMap 功能说明 MultiZMap.js 本类方法功能大多使用 prototype 原型 实现,它是 ZMap 的多加载版本,主要用于类似 DWZ 这个 多标签的 UI 的框架: 包含的 ...
- 使用Cobbler批量部署Linux和Windows:CentOS/Ubuntu批量安装(二)
通过前面服务端的部署,已经配置好了 Cobbler Server 端,接下来开始进行 CentOS/Ubuntu 的批量安装,在进行 CentOS/Ubuntu 批量安装时,也需要通过Cobbler来 ...
- 关于v4包的Fragment过渡动画的事件监听无响应问题解决
项目中部分功能模块采用了单Activity+多Fragment模式,当Fragment切换时,需要在过渡动画执行完后做一些操作,通常就是在自己封装的FragmentBase中重写onCreateAni ...