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 Imagedef 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 tqdmdef 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 tqdmdef 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)
运行过程:
结果:
压缩的图片和之前的看不出啥区别,就不展示了