鱼C论坛

 找回密码
 立即注册
查看: 499|回复: 10

[其他] 火爆全球的主流图片压缩方案自动化脚本(有彩蛋)

[复制链接]
发表于 2023-3-4 03:12:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
火爆全球的主流图片压缩方案自动化脚本



学习指南



本系列课程没有必然的前后关系(除非特别强调)

因此,你可以选择任意一个喜欢的案例开始学习!

了解详情 -> 传送门


视频讲解






工具介绍



这次我们需要用到的工具是 Tinify -> 官网

2023-03-04_4-06-36.png

Tinify 是火爆全球的主流图片在线压缩方案,亚马逊、索尼、三星这些大型企业都是用它来压缩图片的,WordPress 更是将它嵌入到官方组件中。

目前支持的图片格式有 PNG,JPG 和 WebP。

它的实现原理是通过重新组织图片的颜色分布,比如将 24 位的文件转换成 8 位颜色索引的图像。

由于只是调整了图像颜色的存放规律,因此在视觉上几乎是看不出来差异的,但是在文件尺寸的变化上,确实非常明显!

压缩前(815KB)


                               
登录/注册后可看大图


压缩后(150KB)


                               
登录/注册后可看大图


大家可以对比下,压缩前后图片细节是没有任何区别的~

由于这张图片的颜色比较简单,所以压缩率直接干到低于 20% 了!

经过小甲鱼反复测试,一张图片经过优化后的尺寸,大致是原来的 20~30% 左右。


接口开发



为了便于实现压缩流程的自动化,Tinify 贴心地为开发者提供了 API 接口。

只要利用好 API,我们就可以自己定制自动化的实现方案。


第一步:获取密匙(key)

大家打开这个链接 -> 传送门

2023-03-04_4-14-21.png

输入你的名称和邮箱,就可以获取免费的密匙(key)

每个月可以免费压缩 500 张图片的额度,对于个人使用来说,是完全足够的~


第二步:安装 tinify 模块

打开控制台(CMD),输入 pip install tinify 安装 tinify 模块:

2023-03-04_4-22-42.png

注1:如果显示诸如 “pip 不是内部或外部命令” 的错误信息,可使用 python -m pip install tinify 命令代替。

注2:由于 pip 服务器位于国外,导致的情况就是下载速度缓慢,有时甚至罢工(显示红色报错信息),遇到这种情况,我们可以使用下面这个命令代替(使用清华大学的镜像源)

  1. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tinify
复制代码


第三步:小试牛刀

先提交 key,然后使用 from_file()to_file() 两个函数即可实现图片的压缩:

  1. import tinify

  2. tinify.key = # 请在 https://tinify.cn/developers 申请密匙 key

  3. source = tinify.from_file("小甲鱼.jpeg")
  4. source.to_file("opt_小甲鱼.jpeg")
复制代码


项目需求

现在我们需要进一步的开发,让自动化变得更有价值!

基本需求:

1. 实现三种图片输入的方式

  • 用户指定需要压缩的图片文件名称
  • 压缩当前文件夹下所有的 jpg/png/webp 图片(如果用户未指定图片)
  • 将需要压缩的图片拖拽到我们的源文件上,从而实现自动压缩

2. 支持图片的尺寸调整

  • 输入宽度和高度(比如 600 800),表示按比例缩小图片,使其适合给定的尺寸(见下图)
  • 输入宽度(比如 600 0),表示按确定的宽度调整图片,高度适配
  • 输入高度(比如 0 800),表示按确定的高度调整图片,宽度适配
  • 如未输入宽度和高度,则表示按照原始分辨率来压缩图片

api-fit-2x.png

进阶需求:

压缩的过程中输出提示信息,利用装饰器实现。

2023-03-04_5-15-04.png

大家请开拔吧~

如果实在拔不动,可以参考一下下面的开发思路……


开发思路



思路一:实现三种图片输入的方式

题目的需求是实现三种图片输入的方式:

  • 用户指定需要压缩的图片文件名称
  • 压缩当前文件夹下所有的 jpg/png/webp 图片(如果用户未指定图片)
  • 将需要压缩的图片拖拽到我们的源文件上,从而实现自动压缩(Windows)

那么我们按照 if-elif-else 的结构逻辑,

可以将以上三种输入方式的执行顺序归纳如下:

  1. if 用户将图片拖拽到我们的源文件上执行(Windows):
  2.     获取待压缩的图片
  3. elif 用户输入具体需要压缩的图片名称:
  4.     获取待压缩的图片
  5. else:
  6.     获取当前文件夹下所有的 jpg/png/webp 图片
复制代码

那么通过拖拽执行 Python 源文件这么一种骚操作,据我所知好像只有 Windows 支持……

OK,如果是这样的触发 Python 源文件的话,可以通过 sys 模块的 argv 参数获取用户拖拽的文件路径。


思路二:支持图片的尺寸调整

  • 输入宽度和高度(比如 600 800),表示按比例缩小图片,使其适合给定的尺寸
  • 输入宽度(比如 600 0),表示按确定的宽度调整图片,高度适配
  • 输入高度(比如 0 800),表示按确定的高度调整图片,宽度适配
  • 如未输入宽度和高度,则表示按照原始分辨率来压缩图片

调整图片尺寸,可以参考 Tinify 官方文档 -> 传送门

使用 resize() 函数来实现。


思路三:压缩的过程中输出提示信息,利用装饰器实现。




完整源码



完整的源代码实现将在 2023年3月22日 揭晓,

届时,小甲鱼将选取 3 位成功实现需求并且代码优秀的鱼油,

给予以下奖励:

第一名(1000 C币)

第二名(600 C币)

第三名(200 C币)

注:C 币可以兑换任意实物奖品,拥有 C 币的童鞋可以在这里提交想要的宝贝哦 -> 传送门

赶紧回复本帖,亮出你的源代码吧


彩蛋



不是一直有鱼油在问,学习 Python 去哪里找兼职赚外快好呢?

看,机会这不就来了嘛~

opt_IMG_1863.PNG

评分

参与人数 1荣誉 +3 贡献 +3 收起 理由
sfqxx + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-3-4 08:20:25 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-3-4 08:55:25 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-3-4 09:04:08 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-3-5 20:18:22 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-3-12 15:56:29 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-3-13 19:59:39 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 3 天前 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 前天 02:11 | 显示全部楼层
此帖仅作者可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 )

GMT+8, 2023-3-22 00:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表