Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。
gif动图无损压缩
- 1、引言
- 2、代码实战
- 2.1 模块介绍
- 2.2 安装
- 2.3 代码示例
- 3、总结
1、引言
小屌丝:鱼哥, 求助~ 求助~ 求助~
小鱼:你这是告诉我,重要的事情 说三遍吗?
小屌丝:你可以这么理解。
小鱼:好吧… 什么事情,这么慌慌张张。
小屌丝:我的动图太大了, 无法上传到 C站。
小鱼:呦呵… 你也开始写博文了?
小屌丝:向鱼哥看齐。
小鱼:没毛病。话说回来, C站可以上传单张5MB的图片,这都满足不了你?
小屌丝:别提了, 为了能上传这个图片,我可没少想办法。
小鱼:你直接在某网站,进行压缩就可以啊。
小屌丝:不行,需要注册会员,而且,还需要收费的。
小鱼:你还差钱?
小屌丝:哎呦,你不都说白嫖最香吗?
小鱼:… 我… 我可 没说。
小屌丝:你说了… 明明就说了。
小鱼:你还想压缩gif动图吗?
小屌丝:… 想啊
小鱼:那我说过这句话吗?
小屌丝::… 没… 没…有…吧~
小鱼:这还差不多, 那你把图片给我, 我来整。
小屌丝:可行。
我们来看下,小屌丝提供的原图片的大小,10MB,

我们再来看一下,C站的上传图片限制:
因为C站的限制,单张最大上传文件为5MB
想象一下,如果C站不限制图片上传的大小,那是不是… C站得每隔一段时间就得扩容一次。
- 主要是担心运维同学,天天在公司加班,身心疲惫啊~ ~。

所以,为了照顾运维同学的身体,我们就来压缩自己的图片大小吧。
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 = 500img_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知识。
相关文章:
Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。
gif动图无损压缩1、引言2、代码实战2.1 模块介绍2.2 安装2.3 代码示例3、总结1、引言 小屌丝:鱼哥, 求助~ 求助~ 求助~ 小鱼:你这是告诉我,重要的事情 说三遍吗? 小屌丝:你可以这么理解。 小鱼:…...
文献阅读 An implementation of the seismic resolution enhancing network based on GAN
题目 An implementation of the seismic resolution enhancing network based on GAN 基于GAN的地震分辨率增强网络的实现 摘要 对于地震数据,本文利用深度学习来学习不同层次的特征并将它们合并以恢复缺失的分辨率。 将GAN网络引入到地震数据处理;对…...
Google员工说出了我不敢说的心里话!
前言:本文来自Beyond的投稿,码农翻身做了修改。今天在Medium上看到一篇文章《The maze is in the mouse》,是一个刚从Google离职的员工写的,揭开了Google内部的各种问题,引发了很多人的共鸣,到目前为止&…...
“御黑行动”进行中,三月重保单位已开放接入!
三月重保在即,对于诸多政企单位来说,正面临着特殊时期的安全保障工作这一重要“大考”。 面对越来越专业且隐匿的攻击,各单位承受着巨大压力,尤其是政府、国企、央企等具有重要地位及广泛社会影响面的单位,其网站及业务…...
taobao.top.oaid.client.decrypt( 端侧OAID解密 )
¥开放平台免费API不需用户授权 解码OAID(Open Addressee ID),返回收件人信息。该接口用于客户端直接查看订单隐私数据,解密数据不经过ISV服务器,且包含风控等安全检测。 公共参数 请求地址: HTTP地址:http://gw.api.ta…...
QT+OpenGL鼠标操作和模型控制
文章目录QTOpenGL鼠标操作和模型控制鼠标拾取理论有点小复杂从鼠标计算射线第 0 步:2D 视口坐标第 1 步:3d归一化设备坐标第 2 步:4d齐次剪辑坐标第 3 步:4d眼(相机)坐标第 4 步:4d 世界坐标代码展示模型控制多模型加载…...
爱奇艺“资产重定价”:首次全年运营盈利是拐点,底层逻辑大改善
长视频行业历时一年有余的降本增效、去肥增瘦,迎来首个全周期圆满收官的玩家。 北京时间2月22日美股盘前,爱奇艺发布2022年Q4及全年财报,Q4 Non-GAAP净利润明显超越预期,且首次实现全年运营盈利。受业绩提振,爱奇艺盘…...
MySQL —— 库的操作
文章目录1. 创建数据库2. 字符集和校验规则3. 数据库的基本操作3.1 查看数据库3.2 显示创建数据库的语句3.3 修改数据库3.4 删除数据库3.5 备份,还原数据库4. 查看数据库的连接情况1. 创建数据库 基本语法: create database if not exists 数据库名 选项…...
修改shell的命令提示符
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 一、命令提示符格式 从虚拟控制台登陆后,或者从桌面环境的终端进入shell后,就可以看见shell的命令提示符,这意味着可以输入命令了。注意ÿ…...
介绍并比较Apache Hive支持的文件格式
Apache Hive 支持几种熟知的Hadoop使用的文件格式,Hive也能加载并查询其他Hadoop组件创建的不同文件格式,如Pig或MapReduce。本文对比Hive不同文件格式,如:TextFile, SequenceFile, RCFile, AVRO, ORC,Parquet,Clouder…...
C语言之文件操作
目录 一、什么是文件? 二、C语言如何操作文件 1.操作方式 2.文件指针 2.1 定义文件指针 2.2文件的打开与关闭 2.3文件的顺序读写 2.3文件的随机读写 总结 一、什么是文件? 在电脑磁盘的上的文件。在程序设计中,分为两种:程序…...
Linux->父子进程初识和进程状态
目录 前言: 1. 父子进程创建 2. 进程状态 R(running)状态: S(sleep)状态: D(disk sleep)状态: T(stopped)状态: X(dead)和Z(zombie)状态: 孤儿进程: 前言: 本篇主要讲解关…...
【Linux学习笔记】5.Linux 用户和用户组管理
前言 本章介绍Linux的用户和用户组管理。 Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 用户的账号一方面可以…...
茂名市 2021 年高中信息技术学科素养展评
没事干,发一下去年去比赛的题目。 目录 第一题 30分 第二题 30分 第一题 30分 题目: “姐姐,乘除法运算太难了,有什么办法能熟练掌握吗?”今年 读小学四年级的表弟向李红求救。为了提高表弟的运算能力,…...
【软件测试】测试人不躺平,进军高级自动化测试自救,你的不一样结局......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 随着测试从业年龄的…...
win10环境下安装java开发环境安装java
一:环境介绍 安装系统版本:win10 java版本:java SE 17 二:下载Java安装包 官网下载Java安装包:Java Downloads | Oracle 中国 选择需要的Java版本进行下载,如果没有要选择的版本,可以选择最新…...
【华为OD机试模拟题】用 C++ 实现 - 开心消消乐(2023.Q1)
最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...
opencv图像融合
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...
没有经验的时候,怎么搞定面试?
在之前的面试技巧,如何写简历上面,我讲了一些方法,希望大家重 视起来。核心其实就一点:他们想要你表现什么能力,以及你在 这个能力之外还有什么。 看清楚这句话的含义,你就可以做到百发百中。具体怎么训练&…...
整数保序的离散化(C/C++)
目录 1. 离散化的概念 1.1 离散化的运用思路 1.2 离散化的方法 1.2.1 排序 1.2.2 确定一个元素离散化后的结果 1.3 案例分析 1.3.1 1.3.2 区间和 (来源:Acwing) 1. 离散化的概念 离散化,把无限空间中有限的个体映射到有限的…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...

