如题,如何对gif进行压缩。
我一开始想到的办法是利用pillow将gif中的每一帧的取出来,对单帧图片进行压缩后,再调用方法将压缩后的保存回去,但是最后得到的gif没有变小,反而变大了。
后来我对单帧图片保存为png和gif格式,明显gif格式比png格式的大小要大多了,对图像编码这一块不是很了解,有知道原因的吗?或者有知道别的对gif进行压缩的办法。。。
1 ivechan 2017-07-12 12:23:25 +08:00 GIF 压缩一般是跳过某些帧吧,比如 60 帧的你取 20 帧。 GIF 一般都已经被压缩了, 你单帧取出来再压缩也没有什么意义。 |
![]() | 2 baichi 2017-07-12 13:16:05 +08:00 第 N+1 帧把第 N 帧重复的像素去掉(变成透明)试试 |
![]() | 3 dylanninin 2017-07-12 13:32:56 +08:00 via iPhone ![]() |
![]() | 4 XiaoFaye 2017-07-12 14:29:36 +08:00 等全球网络都是万兆连接的时候这个估计就没什么意义了。 |
![]() | 5 lihsen OP @ivechan 现在问题就是,我单帧取出来之后,压缩过后单帧是变小了的,为什么最后整成**gif**的时候整个**gif**就变大了 |
![]() | 6 asd103 2017-07-12 18:17:17 +08:00 ffpmeg 不是更好吗 |
7 gnaggnoyil 2017-07-12 19:50:28 +08:00 GIF 单帧的存储方法都是固定的,你怎么还能把压缩过的单帧图片原封不动地扔进 GIF 容器里去? |
![]() | 8 awanabe 2017-07-12 19:54:36 +08:00 via iPad imageio 试试 |
![]() | 10 lihsen OP @gnaggnoyil GIF 单帧的存储方法是怎样的,我不是很了解这个,能不能再说详细点 |
![]() | 11 lihsen OP @awanabe 试过了,我先是将每一帧取出来保存为 png 格式,然后利用 imageio 将所有的帧整合保存到一起,最后生成的 GIF 的大小还是比所有 png 格式的帧的大小要大 |
12 gnaggnoyil 2017-07-13 00:28:18 +08:00 @lihsen 固定的调色板+LZ77,管你源是 PNG 还是 JPEG |
13 lxy 2017-07-13 00:37:33 +08:00 |
14 NoAnyLove 2017-07-13 01:23:13 +08:00 根据使用工具的经验来看,压缩 GIF 主要是调整调色板、减少颜色,以及最重要的只保留变动的部分。感觉逐帧保存会不会破坏这个? |
15 oglop 2017-07-13 04:03:27 +08:00 via Android 可以用 ffmpeg 或者是 gifsicle |
16 oglop 2017-07-13 04:09:06 +08:00 via Android |
![]() | 17 kxxoling 2017-07-13 04:16:13 +08:00 via iPad 试试 wand |
18 hsmocc 2017-07-13 07:14:48 +08:00 via iPhone @lihsen 以前看网络时候,书上好像说当前帧是 f1,下一帧 f2 的得到可能是 f1 加上相对于 f1 的变化,当 f2 和 f1 的差异非常小时这个变化量就非常小 |
![]() | 19 est 2017-07-13 09:15:48 +08:00 https://en.wikipedia.org/wiki/Motion_JPEG It is natively supported by the QuickTime Player, the PlayStation console, and web browsers such as Safari, Google Chrome, Mozilla Firefox and Microsoft Edge. 我想问为啥大家不用这个。。 |
![]() | 20 zhuangtongfa 2017-07-13 09:49:12 +08:00 ffmpeg |
21 Thiece 2017-07-13 17:13:42 +08:00 可以参考一下 jayxon 的这篇答案 https://www.zhihu.com/question/27201109/answer/146046671 |
22 Thiece 2017-07-13 17:16:48 +08:00 我对 GIF 没有深入的研究过,以下内容仅为猜测;是否是类似视频的 B,I,P 帧呢?在源文件时 GIF 把前后帧相同的区块共用了,但是单独拆帧压缩让前后帧的相同区块破坏掉了。 |
![]() | 23 lihsen OP 花了几天没找到很好的解决办法,压缩必定是要牺牲一些的,要么减少帧数,要么对每帧进行一些重复的区域的处理,第二种方案还没有时间试过。在用 pillow 提取帧再组合帧的时候,发现每一帧上多出了个 local color table,感觉是这个增加了大小,但是还没找到办法去除掉。。。 |
25 zouchtssn 2018-08-01 20:53:51 +08:00 不知道是否会挖坟,不过调用 gifsicle 来进行优化得到的结果还不错。 可以将依赖的二进制文件一并放在工程中。 |