在网上有很多使用 python 的 pillow 库进行图片压缩的教程,使用简单,但是压缩效果存在明显的色彩不自然,这是因为 pillow 库采取的压缩算法没有优化的问题。

这个系列实现一款简单的压缩工具,使用 pngquant 有损压缩,压缩率高达 80%, 而且压缩后的图片没有明显差异。

系列文章:

1,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(一):为什么不用 pillow库.md

2,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(二):使用 pngquant 实现图片压缩

3,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(三):使用 click 库实现命令行

4,使用 python 压缩 png 图片,高达 80% 压缩率,肉眼无差异(四):使用 requests 库上传

开发目的

我经常使用图片。公众号文章发文也好,还是生活中要使用素材。图片是一种比文字更加直观的载体。

但是图片更加占用带宽,很多软件都对图片有大小限制。图片太大也会影响加载速度。

我试过几款图片压缩工具,比如 tinypng 和 tinyjpg 非常好用,体验也非常棒。
但是它存在几个局限的地方:

  • 1, 每次不能超过 20 张图片,因为 tinypng 是一个 web 网站,一次上传太多势必影响
    速度和服务器压力;
  • 2,不能控制压缩比例,这一点 compressjpeg.com 做的很好,可以对每一张图片进行控制
  • 3,写文章的时候我 markdown 用得非常多,所以我希望在压缩的时候顺便上传到图床。

所以希望自己能做一款简单好用的图片工具,顺便定制一些自己常用的功能。

初步设想

我的初步设想是这样的:

1, 先通过命令行的形式来使用,非常方便,后面如果有需求再写界面。

picom 图片名称.jpg

这条命令可以对图片进行智能压缩。格式为原来的格式,生成的新图片名字为 图片名称_picom.jpg

2,指定新文件名

picom name.jpg -o new_name.png

图片的格式也将根据新的文件名称跟着变化

3,只指定格式

picom name.jpg --format png

图片指定为新的格式,但是文件名还是默认的。

4,裁剪大小

picom name.jpg --size normal

图片将被裁剪成正常大小,可以设置几档常用的

5,裁剪指定具体大小

picom name.jpg --size 920*520

6, 上传到图床

picom name.jpg --upload

上传到图床以后,返回图床地址。图床的地址用什么形式保存还在思考。

可能涉及的知识和库

  • click 命令行工具
  • subprocess 子进程管理工具
  • pillow 库使用
  • pngquant (一个png图片有损压缩)
  • mozjpeg
  • optipng (png 无损压缩)
  • python 如何调用 c 代码
  • requests 库和 aiohttp / aiofile 库的使用

尝试使用 pillow 库进行图片压缩

pillow 是 python 处理图片的一个非常厉害的库 , 带有图片压缩的功能。

我先后尝试使用 pillow 的以下 API 对图片进行压缩,得到的结果不是很好。

  • save(quality=50)
  • save(optimize=True)
  • quantize()
  • convert("RGB")

1,quality 参数

save 方法当中的 quality 参数只适合用在 jpg 格式上,通常 80 左右的质量不会有明显的感觉。 用在 png 格式上无效,但是也不报错。

2,optimize 参数

optimize 参数直接压缩没有明显效果。

3,quantize 方法

quantize 是主要用到的压缩优化函数,在 png 格式压缩上,能减少 70% 左右的空间,但是颜色差异明显。

image.png

这是压缩后效果对比:

4, convert 方法 通过把 png的RGBA 格式转化成 RGB 格式,可以减少大约 20% 的大小

5,PNG 以 jpg 格式保存

先通过 convert 方法转成 RGB 格式,然后另存为 jpg 格式,图片效果没有明显减弱,但是大小迅速减少。

结论

pillow 目前不太适合做 PNG 图片压缩处理,jpg 可以作为备选。 pillow 的主要应用场景可以用在灰度转化,尺寸控制方面,这些功能等把核心的压缩问题解决以后再加。

参考资料

请使用手机"扫一扫"x

尝试用python开发一款图片压缩工具1:尝试 pillow库的更多相关文章

  1. python 开发一款图片压缩工具(四):上传图床

    上一篇使用了 pngquant 图片压缩工具进行压缩,并通过 click 命令行工具构建了 picom 包.这篇的主要功能是实现图片上传. 图片上传功能的实现 通过 pngquant 压缩图片后,得到 ...

  2. 开发一款图片压缩工具(三):使用 click 实现命令行

    上一篇实现了图片的压缩函数.现在如果需要对图片进行压缩,可以调用实现的函数进行压缩: pngquant_compress('elephant.png', force=True, quality=20) ...

  3. 开发一款图片压缩工具(二):使用 pngquant 实现图片压缩

    上一篇我尝试使用了 pillow 库对 png 图片进行了压缩,效果不好.这次我换用 pngquant 来压缩.pngquant 是用于 PNG 图像有损压缩的命令行实用程序和库.压缩程序会显著减小文 ...

  4. 分享一下怎么开发一款图片视频类App,秒拍和prisma

    第一步,分解短视频App的功能 我们在秒拍官网看到如此描述: [视频拍摄及导入]支持直接拍摄及导入手机本地的视频 [照片电影]照片专属特效,轻松创作照片电影 [MV特效]10余款全新MV特效,让普通视 ...

  5. 尝试用 Python 写了个病毒传播模拟程序

    病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放 ...

  6. 利用python开发app实战

    你说,我们的未来 被装进棺材,染不上尘埃 *** 我很早之前就想开发一款app玩玩,无奈对java不够熟悉,之前也没有开发app的经验,因此一直耽搁了.最近想到尝试用python开发一款app,goo ...

  7. 【从零学习Python】Ubuntu14.10下Python开发环境配置

    1. 前言 近期在研究计算机视觉的一些算法,也刚開始接触linux,试着在ubuntu下用qt+openCV进行开发,感觉还行.可是Python作为在学术领域广为应用的高级解释性语言.其在计算机视觉的 ...

  8. Python开发(一):Python介绍与基础知识

    Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...

  9. Qt+Python开发百度图片下载器

    一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->收费->百度图片下载器(可试用5分钟) 安装包直接下载地址:htt ...

随机推荐

  1. 学界!关于GAN的灵魂七问

    根据一些指标显示,关于生成对抗网络(GAN)的研究在过去两年间取得了本质的进步.在图像合成模型实践中的进步快到几乎无法跟上. 但是,根据其他指标来看,实质性的改进还是较少.例如,在应如何评价生成对抗网 ...

  2. Taro 和 uni-app选型对比

    一.Taro和uni-app的介绍 1.taro的介绍 taro是多端统一开发框架,支持用 React 的开发方式编写一次代码,生成能运行在微信/百度/支付宝/字节跳动小程序.H5.React Nat ...

  3. Java 垃圾回收机制方法,判断对象存活算法

    垃圾回收机制: 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回 ...

  4. Reface.AppStarter 框架初探

    Reface.AppStarter 是一种基于 .NetFramework 的应用程序启动模式,使用该启动模式,你可以轻松的得到以下功能 : IOC / DI 自动注册与装配 简化配置 垂直模块化你的 ...

  5. CSS样式的4种写法 | 以及选择器的几种用法

    CSS样式: 1.内部样式表 <style type="text/css">    样式表写法   </style> 2.使用link标签,在文档中声明使用 ...

  6. 使用Azure Rest API获得Access Token介绍

    背景 本文主要介绍如何获取如何获取Azure Rest API的访问token,所采用的是v2.0版本的Microsoft标识平台,关于1.0和2.0的区别可以参考 https://docs.azur ...

  7. 配置一个mariadb数据库《二》

                                                             mariadb 配置一个数据库 案例4:配置一个数据库 4.1 问题 本例要求在虚拟机 ...

  8. mysql--使用left join条件查询时加where条件的问题

    场景:为一个活动添加指导文件,每一个活动会对应多种指导文件类型,进入每一个活动的设置指导文件页面后所呈现的指导文件类型相同,查询时,使用指导文件类型表LEFT JOIN指导文件表,要求指导文件类型全部 ...

  9. 【php】错误日志处理

    一. 错误处理: a) 在写程序的过程当中,遇到错误时,你的反应?可能比较急躁,比较烦 b) 遇到错误后:一别哭,二别闹,三别上吊,四别尿……二. 你可能会遇到的错误: a) 语法错误 i. 语法错误 ...

  10. django-filter的基本使用

    django-filter 查询 创建model和视图 from django.db import models # Create your models here. class Student(mo ...