抠图制作技巧图解(裁剪满大街都是)
引言
本文最初是源于一个需求,是这样描述的:
如何从动画gif中每隔一帧移除一次?
这问题本身,从职业角度一看,就知道必须用编程,或者工具实现。
提问的小哥又详细进行了描述:
我有很多视频文件,想转换为gif动图。ffmpeg/avconv 在直接操作方面做得很差,所以我曲线救国,把视频转换为 gif 格式。方法是先将每一帧输出为 png ,然后使用 imagemagick 将其转换回 gif 格式。
问题是,就文件而言,这会生成较大体积的 gif 动图。
为了解决这个问题,我想从 gif 中每隔一秒或第 N 帧“删除”一次,或者在转换为 gif 时跳过图像文件,或者从 gif 中删除帧。
如何在 Linux 上使用 imagemagick 或其他命令行工具完成此操作?
1 - 最简单直接 gifsicle
放在第一位,肯定是最佳解决方案啦。只一行就足够了。
gifsicle -U input.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
本身这个构造就相当牛B,因为 gifsicle 默认是只能手动指定删除哪些帧。
而结合 Bash 的妙用,可以灵活地控制生成的帧数,并保存到新文件。
这个命令应该可以在大多数Unix shell中工作,将 input.gif 和 output.gif 替换为输入和输出文件名,将 99 替换为动画中的帧数。
参数说明:
- -U选项:将输入动画中的帧与前面的帧合并,这样每个帧都是独立的,并且不依赖于任何其他帧。
- -O2选项:会重新优化输出动画以最小化文件大小。
- seq:使用格式化输出序列字符串。
2 - Bash 脚本
还是要用到 gifsicle 工具,我们创建一个下面这样的脚本处理文件。
做一个简单测试,首先生成轮询播放0-9数字,如下动图:
运行上述脚本之后的结果:
3 - Photoshop
UI 设计必备工具,也具备了很多功能,可是没有上面两条用起来那么随意。不在命令行处理,受桌面应用的约束就越大。
通过菜单 File -> Import -> Video Frames to Layers 打开下面的界面:
其中的 “Limit To Every __ Frames”就是可实现。
写在最后
对于个人而言,我更倾向于使用命令行的 gifsicle 处理工具.
因为可自定义参数很灵活,组装起来极为方便。且批量处理威力巨大,不必拘泥于界面操作,效率高的不止一点半点。
Happy coding :-)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com