如题,如何对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 1
|
4
XiaoFaye 2017-07-12 14:29:36 +08:00
等全球网络都是万兆连接的时候这个估计就没什么意义了。
|
5
lihsen OP @ivechan 现在问题就是,我单帧取出来之后,压缩过后单帧是变小了的,为什么最后整成**gif**的时候整个**gif**就变大了
|
6
tumbzzc 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 来进行优化得到的结果还不错。
可以将依赖的二进制文件一并放在工程中。 |