今天遇到一个问题,制作的网站因为图片尺寸比较大导致加载很慢,所以想通过压缩图片的方式来加快页面的加载速度(当然也可以选择cdn和oss的方式来加快页面加载速度)
话不多说,Python肯定是首选项嘛,那么PIL(Python Imaging Library)库肯定是要用到的,下面一起看下怎么操作吧
一、安装PIL库
pip install Pillow
Pillow对python的版本有一定要求,详见下图:
二、检验是否安装成功
from PIL import Image
print(Image.__version__)
三、打开图片
img = Image.open("test.jpg")# 如果文件不存在或格式不支持,会抛出异常。所以我们可以用try-except语句来捕获异常,并打印错误信息
try:img = Image.open("test.jpg")
except IOError as e:print(e)
四、保存图片
img.save("new.jpg")# 如果要指定保存的格式,可以传入format参数,例如:
img.save("new.png", format="PNG")# 如果要指定保存的质量,可以传入quality参数,取值范围是1-95,默认是75。质量越高,文件越大,压缩效果越差;质量越低,文件越小,压缩效果越好。例如:
img.save("new.jpg", quality=50)
五、获取图片信息
在对图像进行压缩之前,我们可能需要获取一些图像的基本信息,例如大小、格式、模式等。这些信息可以通过Image对象的属性来获取
# size属性:返回一个元组,表示图像的宽度和高度(单位是像素),例如(800, 600)
print(img.size) # (800, 600)# format属性:返回一个字符串,表示图像的格式,例如"JPEG"
print(img.format) # JPEG# mode属性:返回一个字符串,表示图像的模式,例如"RGB"
print(img.mode) # RGB
六、修改图片
如果要修改图像的大小、格式或模式,可以使用Image对象的方法
# resize方法:接受一个元组作为参数,表示新的宽度和高度(单位是像素),返回一个新的Image对象
new_img = img.resize((400, 300))# convert方法:接受一个字符串作为参数,表示新的模式,返回一个新的Image对象
new_img = img.convert("L") #转化为为灰色图像# transpose方法:接受一个常量作为参数,表示旋转或翻转的方式,返回一个新的Image对象
new_img = img.transpose(Image.ROTATE_90) #旋转90度
七、压缩图片
有了上面的知识,我们就可以开始压缩图像了。压缩图像的本质就是减少图像的大小和质量,从而减少图像占用的空间和带宽。我们可以通过以下几种方式来压缩图像
1、改变图片大小resize
# 改变图像的大小:通过resize方法,我们可以将图像的宽度和高度缩小一半或更多,这样就可以大幅度减少图像的像素数,从而减少图像的大小。例如:img = Image.open("test.jpg")
print(img.size) # (640, 640)
new_img = img.resize((400, 300))
print(new_img.size) # (400, 300)
new_img.save("new.jpg")
2、该片图片格式format
改变图像的格式:通过save方法,我们可以将图像保存为不同的格式,不同的格式有不同的压缩算法和效率
# 一般来说:
# JPEG格式比PNG格式更适合压缩彩色图像
# PNG格式比JPEG格式更适合压缩黑白或透明图像img = Image.open("test.png")
print(img.format) # PNG
img.save("new.jpg", format="JPEG")
print(new_img.format) # JPEG
3、改变图片质量quality
改变图像的质量:通过save方法,我们可以指定quality参数,来控制图像保存时的质量。质量越低,压缩效果越好,但是也会损失一些细节和清晰度。我们可以根据需要,选择一个合适的质量值
img = Image.open("test.jpg")
img.save("new.jpg", quality=50)
4、改变图片模式convert
改变图像的模式:通过convert方法,我们可以将图像转换为不同的模式。不同的模式有不同的颜色数和位深度,一般来说,颜色数越少,位深度越低,压缩效果越好。
例如:
RGB模式有16777216种颜色,每个像素占用24位;
L模式只有256种颜色,每个像素占用8位;
1模式只有2种颜色(黑白),每个像素占用1位。
# 我们可以将彩色图像转换为灰度或黑白图像来压缩img = Image.open("test.jpg")
print(img.mode) # RGB
new_img = img.convert("L")
print(new_img.mode) # L
new_img.save("new.jpg")
关于批量压缩图片可以看我之前的文章:https://blog.csdn.net/weixin_42019349/article/details/132689515希望对你有所帮助 __