PYTHON 自动化办公:压缩图片(PIL)

1、介绍

在办公还是学习过程中,难免会遇到上传照片的问题。然而照片的大小限制一直都是个问题,例如照片限制在200Kb之内,虽然有很多图像压缩技术可以实现,但从图像处理的专业来说,可以利用代码实现

这里使用的库函数是python的PIL库(Pillow),pillow安装命令如下

pip install pillow

这里使用PIL.Image.save()方法内部使用压缩算法对图片进行的压缩处理。

form PIL import Image
img = Image.open("demo.jpg")
img.save(img_name, quality=95)

quality参数: 保存图像的质量,值的范围从1(最差)到95(最佳), 默认值为75。

值如果高于100,会禁用部分JPEG压缩算法,并导致大文件图像质量几乎没有任何增益。

提示:subsampling参数:子采样,通过实现色度信息的分辨率低于亮度信息来对图像进行编码的实践。可以配合quality使用,具体实现可以自己上网查询

2、压缩单张图片

代码如下:因为保存需要文件名,不同的图片后缀啊、名称啊各不相同,这里简单提供了一个,也可以直接在img.save 里面自己指定

from PIL import Image


def main(img_path):
    ret_path = img_path.split('.jpg')[0]        # .jpg 根据后缀更改
    ret_path = ret_path + '_result.jpg'         # 返回的图片名

    img = Image.open(img_path)
    img.save(ret_path,quality=15)


if __name__ == '__main__':
    root = 'test.jpg'         # 传入图片的路径
    main(img_path=root)

效果展示:

一般quailty 值放到30-45就差不多了,图片质量看不出啥区别

3、多张图片压缩(单个文件夹)

如果压缩多张图片的话,直接把图片放在同一个文件夹目录下即可

这里的测试代码(demo.py)测试文件夹(demo)在同一级路径,或者指定路径也行

代码差不多,这里不介绍,直接展示了:

这里会返回新的目录,不会改变图片的文件名或者后置

如果不满意压缩结果,这样多次运行程序,会自动将之前的结果替换

from PIL import Image
import os
from tqdm import tqdm


def main(folder_path):
    ret_folder_path = folder_path + '_ret'              # 返回父目录
    if not os.path.exists(ret_folder_path):             # 建立目录
        os.makedirs(ret_folder_path)

    img_path= [i for i in os.listdir(folder_path)]      # 所有图片路径

    for i in tqdm(img_path):
        img = os.path.join(folder_path,i)
        img = Image.open(img)                   # 打开图片
        img.save(os.path.join(ret_folder_path,i),quality=15)


if __name__ == '__main__':
    root = './demo'             # 多个图片的父目录
    main(folder_path=root)

运行过程:

结果:

这里的图片肉眼看不出区别,就不展示了

4、 多个文件夹的图片压缩

如果有多个文件夹,每个文件夹下都有图片的话,可以新建个父目录,将所有文件夹放进去

代码类似的,这里直接展示:

这里会返回新的目录,不会改变子文件夹的名称或者图片的名称和后缀

如果不满意压缩结果,需要将返回的父目录删除,否则会报错!!!

from PIL import Image
import os
from tqdm import tqdm


def main(folder_path):
    ret_folder_path = folder_path + '_ret'  # 返回父目录
    if not os.path.exists(ret_folder_path):  # 建立目录
        os.makedirs(ret_folder_path)

    sub_folder_path= [i for i in os.listdir(folder_path)]       # 次级目录
    for i in sub_folder_path:           # 遍历次级目录
        os.makedirs(os.path.join(ret_folder_path,i))    # 建立子目录
        for j in tqdm(os.listdir(os.path.join(folder_path,i)),desc=i):       # 遍历当前次级目录的所有图片
            img_path = os.path.join(folder_path,i,j)            # 图片路径
            img = Image.open(img_path)
            img.save(os.path.join(ret_folder_path,i,j),quality=15)


if __name__ == '__main__':
    root = './demo'             # 父目录
    main(folder_path=root)

运行过程:

结果:

压缩的图片和之前的看不出啥区别,就不展示了

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听风吹等浪起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值