Linux动态gif图的录制
Linux动态gif图的录制
前几天写了两篇博客vim的配置和Vim的自动代码补全插件YCM的安装和配置,反响还不错。为了演示效果,想着录制几张动态的gif效果图。抽空录制了几张,但是在Linux下录制的过程并不是一帆风顺。最开始想用大家推荐的byzanz,但是我在ubuntu13.04使用unity桌面(非gnome),byzanz依赖于gnome-panel, 所以只能在命令行下通过参数操作使用,很不方便。后来自己通过使用recordmydesktop录制成ogv视频再使用convert转换制作成gif。特将其注意事项记录下。不知道其他博友们再Linux下制作动态gif图片有啥推荐。
byzanz的安装与使用
Ubuntu下安装
sudo add-apt-repository ppa:fossfreedom/byzanz
sudo apt-get update
sudo apt-get install byzanz
你可以通过如下命令来完成录制过程:
byzanz-record -d 40 -x 0 -y 0 -w 400 -h 320 byzanz-demo.gif
其中:
- -d 40 为录制的时长为 40 秒
- -x 0 录制区域的横坐标
- -y 0 录制区域的纵坐标,记住:屏幕右上角为原点(0,0)
- -w 400 录制区域的宽度
- -h 320 录制区域的高度
byzanz-demo.gif 保存的文件名
详细参数可通过byzanz-record --help查看。
我使用unity桌面的ubuntu下不能使用byzanz的图形界面。即使是通过sudo apt-get install gnome-session-fallback
并注销选择gnome桌面来安装byzanz也不能启用byzanz的图形界面。图形界面使用byzanz制作gif可以看参考部分的连接
recordmydesktop再convert成gif
recordmydesktop是一款著名的录屏工具。它有gtk版本。使用很方便
- 安装
sudo apt-get install imagemagick mplayer gtk-recordmydesktop
- 使用
gtk-recordmydesktop
录制并保存文件为 out.ogv - 执行如下命令將 out.ogv 分解成单帧图片
mplayer -ao null out.ogv -vo jpeg:outdir=.
- 执行如下命令將单帧图片压缩成 gif 图片
convert *.jpg out.gif
- 执行如下命令將 gif 图片进行压缩
convert out.gif -fuzz 10% -layers Optimize optimized.gif
第5步的压缩效果很好,我做的一个能将一个30多M的压缩成900多k
- 注意事项:
通过上述第4步产生的out.gif如果太大,在第5步中进行压缩优化时会出现
convert.im6: UnableToAcquireString `Cannot allocate memory' @ fatal/string.c/AcquireString/135.
错误。
小一点的不会出现这个错误。
我的解决方法比较笨。就是将第3步产生的单张jpg图片分成几个部分分别压缩成gif图片,这样每个gif图片都不会太大,再经过第5步压缩优化后合并成一个gif图片。例如我在录制这里的时长1分多钟的vim的配置效果图时,分解成单张的jpg图片有600多张,直接将他们压缩成gif图片大小有80多M,在进行第5步压缩优化时就会出现`Cannot allocate memory'错误,我是将这600多张图分成2部分(前300张和后面300多张)分别压缩成2个gif图片,这样再压缩优化时就不会分配内存出错。再将这两张合成一张。
在将ogv视频合成gif图片时我也尝试过使用QGifer,但转换的质量效果没有使用convert的好,且压缩比率也没convert高
参考资料
RECORD YOUR LINUX DESKTOP IN AN ANIMATED GIF WITH BYZANZ
Convert Ogv -video to Gif -animation
Linux动态gif图的录制的更多相关文章
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- Linux 动态库剖析
进程与 API 动态链接的共享库是 GNU/Linux® 的一个重要方面.该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用.本文研究了创建和 ...
- Linux动态频率调节系统CPUFreq之三:governor
在上一篇文章中,介绍了cpufreq的core层,core提供了cpufreq系统的初始化,公共数据结构的建立以及对cpufreq中其它子部件提供注册功能.core的最核心功能是对policy的管理, ...
- Linux动态频率调节系统CPUFreq之二:核心(core)架构与API
上一节中,我们大致地讲解了一下CPUFreq在用户空间的sysfs接口和它的几个重要的数据结构,同时也提到,CPUFreq子系统把一些公共的代码逻辑组织在一起,构成了CPUFreq的核心部分,这些公共 ...
- windows动态库与Linux动态库
Linux动态库和windows动态库的目的是基本一致的,但由于操作系统的不同,他们在许多方面还是不尽相同.但是尽管有差异Linux动态库的windows动态库还是可以移植的,有一些规则以及经验是必须 ...
- 使用 firewalld 构建 Linux 动态防火墙
firewalld 是新一 Linux 代防火墙工具,它提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具.它也支持允许服务或者应用程序直接添加防火墙规则的 ...
- UML动态模型图简单介绍
UML动态模型图描述了系统动态行为的各个方面,包括用例图.序列图.协作图.活动图和状态图.下面就每种图做一个简单介绍: 用例图 用例图描述系统外部的执行者与系统提供的用例之间的某种联系.所谓用例是指对 ...
- Heatmap.js v2.0 – 最强大的 Web 动态热图
Heatmap 是用来呈现一定区域内的统计度量,最常见的网站访问热力图就是以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示.Heatmap.js 这个 JavaScript 库可以实现 ...
- 【BZOJ-2879】美食节 最小费用最大流 + 动态建图
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1366 Solved: 737[Submit][Status] ...
随机推荐
- Linux Shell编程 sed命令
概述 sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小.所以,它可以对从如管道这样的标准输入中接收的数据进行编辑. sed 主要是用来将数据进行选取.替换 ...
- 八、golang文本操作、json协议
一.终端读写 操作终端相关文件语句常量,go所有的都是接口 os.Stdin:标准输入 os.Stdout:标准输入,只要实现输出这个接口,打印到终端, os.Stderr:标准错误输出 os.Ope ...
- kubernetes 核心对象
Pods Pod是Kubernetes的基本操作单元,也是应用运行的载体.整个Kubernetes系统都是围绕着Pod展开的,比如如何部署运行Pod.如何保证Pod的数量.如何访问Pod等.另外,Po ...
- POJ 1144 无向图求割点
学长写的: #include<cstdio>#include<cstdlib>#include<cmath>#include<iostream>#in ...
- python 操作mongoDB数据库
网上关于python 操作mongoDB的相关文章相对不是很多,并且质量也不是很高!下面给出一个完整的 增删改查示例程序! #!/usr/bin/python # -*- coding: utf-8 ...
- VC 写注册表
BOOL Running() { HKEY hKey; LPCTSTR strRegPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion ...
- DS 和【ADDRESS】学习记录
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址. 内存单元由2部分组成. 8086CPU中,内存地址由以下组成. 1:段地址 2:偏移地址 8086CPU中,有一个DS寄存器地址,通常用 ...
- ambari2.4.2在CentOS7上的二次开发
前言:如果想安装到CentOS7,就一定要将源码在CentOS7上编译,然后安装,否则可能会出现各种问题 目录 源码结构 技术点 编译环境的搭建 安装samba 安装编译环境 整体编译 ambari ...
- [转]理解Object.assign
本节内容我们继续探讨关于ES2015的一些新的内容,Object.assign函数的使用,使用该函数我们可以快速的复制一个或者多个对象到目标对象中,本文内容涉及es6,es7相关的对象复制的内容,以及 ...
- JAVA中的泛型类型不可以直接初始化
class Para<CLS>{ private CLS class1; public Para(CLS class1) { ...