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