Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。

gif动图无损压缩

  • 1、引言
  • 2、代码实战
    • 2.1 模块介绍
    • 2.2 安装
    • 2.3 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥, 求助~ 求助~ 求助~
小鱼:你这是告诉我,重要的事情 说三遍吗?
小屌丝:你可以这么理解。
小鱼:好吧… 什么事情,这么慌慌张张。
小屌丝:我的动图太大了, 无法上传到 C站。
小鱼:呦呵… 你也开始写博文了?
小屌丝:向鱼哥看齐。
小鱼:没毛病。话说回来, C站可以上传单张5MB的图片,这都满足不了你?
小屌丝:别提了, 为了能上传这个图片,我可没少想办法。
小鱼:你直接在某网站,进行压缩就可以啊。
小屌丝:不行,需要注册会员,而且,还需要收费的。
小鱼:你还差钱?
小屌丝:哎呦,你不都说白嫖最香吗?
小鱼:… 我… 我可 没说。
小屌丝:你说了… 明明就说了。
小鱼:你还想压缩gif动图吗?
小屌丝:… 想啊
小鱼:那我说过这句话吗?
小屌丝::… 没… 没…有…吧~
小鱼:这还差不多, 那你把图片给我, 我来整。
小屌丝:可行。

我们来看下,小屌丝提供的原图片的大小,10MB

在这里插入图片描述

我们再来看一下,C站的上传图片限制:

因为C站的限制,单张最大上传文件为5MB
Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。_第1张图片

想象一下,如果C站不限制图片上传的大小,那是不是… C站得每隔一段时间就得扩容一次。

  • 主要是担心运维同学,天天在公司加班,身心疲惫啊~ ~。
    Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。_第2张图片

所以,为了照顾运维同学的身体,我们就来压缩自己的图片大小吧。

2、代码实战

2.1 模块介绍

因为是要生成gif动图,所以,必不可少的模块:ImageIo

  • 如果你不了解ImageIo,那你可以借着这个机会来了解它;
  • 如果你了解ImageIo,那你可以借着这个机会来加深印象;

小屌丝:这合着, 不管会不会,都要重新学习一次呗。
小鱼:知识就是在复习与学习之间,才能完全掌握的。
小屌丝:服。。

1、ImageIo定义:

引言官网的解释:ImageIo提供了一系列示例图像,可以使用类似于URI的方式来使用。

换句话说,即:ImageIo是一个处理图像的接口

2、ImageIo组成部分

ImageIo分为三部分,如下:

  • Plugin:面向后端的适配器

    • 用于响应来自 它可以将来自 iio.core 的请求转换为 满足请求的后端指令(例如,读/写/迭代);
  • Backend Library:可以读取和/或写入的库 图像或类似图像的对象(/视频);

    • 它可以据需要进行安装;
  • ImageResource:包含图像数据的数据 blob;

    • 通常是由ImageIo读取驱动器。

看到这, 是不是对ImageIo有了初步的了解。
接下来, 我们就去体会ImageIo的强大功能喽。

2.2 安装

由于ImageIo是第三方库,所以,在使用前,要安装。
老规矩,我们直接pip方式安装,即:

pip install imageio

然后就是等待着安装。

pip的安装方式很多,你可以,直接看这两篇:

  • Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
  • Python3:我低调的只用一行代码,就导入Python所有库!

2.3 代码示例

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-02-15
# @Author : Carl_DJ


'''
实现功能
    使用ImageIo 和PIL库,对gif动图进行压缩处理
'''

import imageio
from PIL import Image, ImageSequence

# 设置压缩尺寸,这里设置压缩尺寸为500
rp = 500

img_list = []

# 读取原gif动图
img = Image.open("./data/param-demo.gif")

# 对原动图进行压缩,并存入img_list 
for i in ImageSequence.Iterator(img):
    i = i.convert('RGB')
    if max(i.size[0], i.size[1]) > rp:
        i.thumbnail((rp, rp))
    img_list.append(i)

# 计算帧的频率
durt = (img.info)['duration'] / 1000

# 读取img_list合成新的gif
imageio.mimsave('param-out.gif', img_list, duration=durt )

运行结果

在这里插入图片描述
你看, 这压缩完成后, 就是2.7MB,这缩小的不是一点点。
接着,我展示下压缩后的动图,看看是不是无损展示。

小鱼:你看, 是不是非常完美。
小屌丝:唉, 鱼哥,你这动图,怎么似曾相似啊
小鱼:这说明,你又仔细的看我的博文了,这就《Python3,2分钟掌握Doscoart库,你也能成为艺术大师。》 这篇啊。
小屌丝:我去~~~ 我说的嘛。

3、总结

看到这里, 今天的分享就差不多结束了。
同样,回顾下今天的内容,其实很简单的。
介绍了什么是ImageIo,已经ImageIo的组成部分,和代码实战。

所以, 是不是觉得, 跟着小鱼学习新知识,根本就没有那么费劲呢。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO 博客专家
  • 51认证讲师
  • 金牌面试官&面试培训师

关注,带你学习更多更有趣的Python知识。

你可能感兴趣的:(python)