Python Pillow Image.save 保存为jpg图片压缩问题
作者:翱翔的赖克 发布时间:2023-07-05 11:13:49
Pillow图片格式转换
Pillow 库支持多种图片格式,您可以直接使用 open() 方法来读取图片,并且无须考虑图片是何种类型。Pillow 能够很轻松地实现图片格式之间的转换。
图片格式之间的转换主要有以下两种方法,下面分别对它们进行了介绍:
save()
顾名思义,save() 方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。save() 的语法格式如下:
Image.save(fp, format=None)
参数说明如下:
fp:图片的存储路径,包含图片的名称,字符串格式;
format:可选参数,可以指定图片的格式。
示例如下:
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
im.save('C:/Users/Administrator/Desktop/c.biancheng.net.bmp')
此时您的计算机桌面上会存在一个 c.bianchneg.net.BMP格式的图片。
convert()+save()
注意,并非所有的图片格式都可以用 save() 方法转换完成,比如将 PNG 格式的图片保存为 JPG 格式,如果直接使用 save() 方法就会出现以下错误:
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
im.save('C:/Users/Administrator/Desktop/c.biancheng.net.jpg')
错误信息如下所示:
#系统错误,RGBA不能作为JPEG图片的模式
OSError: cannot write mode RGBA as JPEG
引发错误的原因是由于 PNG 和 JPG 图像模式不一致导致的。其中 PNG 是四通道 RGBA 模式,即红色、绿色、蓝色、Alpha 透明色;JPG 是三通道 RGB 模式。因此要想实现图片格式的转换,就要将 PNG 转变为三通道 RGB 模式。
Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心。语法格式如下:
convert(mode,parms**)
mode:指的是要转换成的图像模式;
params:其他可选参数。
修改后的代码如下所示:
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
#此时返回一个新的image对象,转换图片模式
image=im.convert('RGB')
#调用save()保存
image.save('C:/Users/Administrator/Desktop/c.biancheng.net.jpg')
通过以上代码,成功将 PNG 格式的图片转换为了 JPG 格式。
Pillow Image.save 保存为jpg图片压缩
在使用Pillow中的Image.save()方法,使用默认参数保存jpg图片的过程中发现图片被压缩的很严重,导致原来很大的大小变成几十K。这是因为在保存为jpg的过程中,内部使用压缩算法对图片进行的压缩处理。
但是有些时候往往需要图片的大小不能变化太大或不能太小。所以在使用此方式时可以加入参数:
imObj.save(img_name, quality=95)
quality参数: 保存图像的质量,值的范围从1(最差)到95(最佳)。 默认值为75,使用中应尽量避免高于95的值; 100会禁用部分JPEG压缩算法,并导致大文件图像质量几乎没有任何增益。
使用此参数后,图片大小会增加。如果图片的大小还不能满足你的需求,是否还有其他方式去增加图片大小呢?
通过查阅资料并尝试,发现save方法还有一个可以配合quality使用的参数,能够大大增加图片大小:
imObj.save(new_name, quality=95, subsampling=0)
subsampling参数:子采样,通过实现色度信息的分辨率低于亮度信息来对图像进行编码的实践。 (参考:https://en.wikipedia.org/wiki/Chroma_subsampling)
可能的子采样值是0,1和2,对应于4:4:4,4:2:2和4:1:1(或4:2:0?)。
经过实践将值设为0便可以满足图片大小增大的需求。
注意: 以上方法的参数只针对于保存为JPG/JPEG格式的图片的情况。
参考文档:https://pillow.readthedocs.io/en/5.1.x/handbook/image-file-formats.html#jpeg
参考文档:https://pillow.readthedocs.io/en/4.0.x/PIL.html
来源:https://blog.csdn.net/weixin_41935140/article/details/83308359


猜你喜欢
- 本文实例讲述了python获取目录下所有文件的方法。分享给大家供大家参考。具体分析如下:os.walk()函数声明:walk(top,top
- Django内置的filter有很多,然而我们由于业务逻辑的特殊要求,有时候仍然会不够用,这个时候就需要我们自定义filter来实现相应的内
- Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展,文件上传的方式越来越多样。而有一些文件上传的控件,要做自动化控制会更
- mongodb是基于分布式文件存储的nosql(非关系型)数据库虽说是nosqldb, but mongodb 其中的文档可以是关系型的在m
- --******************************************************* --* 清空所有表中的数
- ########################## # # # 为了避免截断中文字符 # # 文件要求是 unicode 编码 # # t
- Python中会遇到很多关于排序的问题,今天小编就带给大家实现插入排序的方法。在Python中插入排序的基本原理类似于摸牌,将摸起来的牌插入
- Python Dash开发Web应用的控件基础本文主要是通过Dash的Checklist组件,简单介绍使用Dash开发的Web应用展示效果如
- 我看blog里,还有很多地方都引用过我写的这个类,转了不少,但自己一直也没发表过,这次正式发表一下。在蓝色理想中有人不懂怎么用,我在baid
- 如何去读取一个没有表头的二维csv文件(如下图所示)?并以元组的形式表现数据:((1.0, 0.0, 3.0, 180.0), (2.0,
- PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,L
- 问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有to
- 如下所示:# 计算一个字符串中所有数字的和def numsum(s):sum = 0
- 一、算法概述AdaBoost 是英文 Adaptive Boosting(自适应增强)的缩写,由 Yoav Freund 和Robert S
- 起因事情是这样的,项目最近有个需求。服务器有个图片空间,说白了就是个文件夹。文件夹的结构大家都知道,一层一层的。然后需要在前端以树形展示。具
- 今天在做python获取邮件时需要递归调用解析函数才可以解析邮件内容,最后想要将解析出的内容返回时发现返回的是None 可以内容却可以打印出
- 本文实例讲述了基于wxpython实现的windows GUI程序。分享给大家供大家参考。具体如下:# using a wx.Frame,
- Python 爬虫图片简单实现经常在逛知乎,有时候希望把一些问题的图片集中保存起来。于是就有了这个程序。这是一个非常简单的图片爬虫程序,只能
- 数据库在高并发的场景下使用外键约束会有锁问题并且使用外键会增加运维成本,所以很多公司都规定生产环境的数据库禁止使用外键。那么不使用外键约束的
- K近邻法是有监督学习方法,原理很简单,假设我们有一堆分好类的样本数据,分好类表示每个样本都一个对应的已知类标签,当来一个测试样本要我们判断它