Python压缩图片大小

发布时间:2024年01月01日

今天遇到一个问题,制作的网站因为图片尺寸比较大导致加载很慢,所以想通过压缩图片的方式来加快页面的加载速度(当然也可以选择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希望对你有所帮助 __

文章来源:https://blog.csdn.net/weixin_42019349/article/details/135324259
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。