Python实现图片批量压缩与尺寸调整实战
本文介绍使用Python的Pillow库进行图片批量压缩与尺寸调整的方法。通过安装依赖、遍历目录、获取文件大小,并设定目标体积(如150KB)和压缩步长,程序可自动迭代降低图片质量直至达标。同时支持先调整图片分辨率再压缩体积的操作流程,适用于提升网页加载速度的场景。
在Web项目中,图片资源的加载速度直接影响用户体验。当原始图片体积过大时,会导致页面加载缓慢。为了解决这一问题,需要对项目中的图片文件进行统一的压缩处理,以减小文件体积并提升加载效率。
实现方案一:基于Pillow库的压缩与调整
首先,需要安装Python的图片处理库Pillow。
python -m pip install Pillow
在Python脚本中导入必要的模块,包括用于图片处理的Image以及用于文件操作的os模块。
from PIL import Image
import os
为了判断图片是否需要进行压缩,需要编写一个函数来获取图片文件的实际大小。该函数通过os.path.getsize获取字节数,并转换为KB单位返回。
def get_size(file):
# 获取文件大小:KB
size = os.path.getsize(file)
return size / 1024
接下来,需要遍历指定目录下的所有文件,筛选出需要处理的图片文件,并打印文件名以便确认处理对象。
dir_path = r'file_path'
items = os.listdir(dir_path)
for item in items:
# print(item)
path = os.path.join(dir_path, item)
print(item)
核心压缩逻辑:定义一个compress_image函数,目标是将图片压缩至指定大小(例如150KB)。该函数接受源文件路径、输出路径、目标大小(mb)、调整步长(step)和初始质量(quality)作为参数。如果源文件已小于目标大小,则直接复制;否则,通过循环降低quality值(每次减少step),重新保存文件,直到文件大小小于或等于目标值。
def compress_image(infile, outfile=None, mb=150, step=10, quality=80):
"""不改变图片尺寸压缩到指定大小
:param infile: 压缩源文件
:param outfile: 压缩文件保存地址
:param mb: 压缩目标,KB
:param step: 每次调整的压缩比率
:param quality: 初始压缩比率
:return: 压缩文件地址,压缩文件大小
"""
if outfile is None:
outfile = infile
o_size = get_size(infile)
if o_size <= mb:
im = Image.open(infile)
im.save(outfile)
while o_size > mb:
im = Image.open(infile)
im.save(outfile, quality=quality)
if quality - step < 0:
break
quality -= step
o_size = get_size(outfile)
尺寸调整逻辑:如果同时需要修改图片分辨率,可以定义resize_image函数。该函数根据设定的宽度(x_s)按比例计算高度,使用Image.ANTIALIAS算法进行重采样,保存调整后的图片。建议先执行尺寸调整,再执行体积压缩,以获得最佳效果。
def resize_image(infile, outfile='', x_s=800):
"""修改图片尺寸
:param infile: 图片源文件
:param outfile: 重设尺寸文件保存地址
:param x_s: 设置的宽度
:return:
"""
im = Image.open(infile)
x, y = im.size
y_s = int(y * x_s / x)
out = im.resize((x_s, y_s), Image.ANTIALIAS)
out.save(outfile)
程序执行:在主程序中调用上述函数,指定源文件路径和目标输出路径。例如,将指定目录下的图片压缩并保存至E盘docs文件夹下。
if __name__ == '__main__':
# 源路径 # 压缩后路径
compress_image(r"file_path", r"E:\docs\2.JPG")
# 源路径 # 压缩后路径
resize_image(r"file_path", r"E:\docs\3.JPG")
实现方案二:另一种批量处理思路
import os
from PIL import Image
import threading,time
def imgToProgressive(path):
if not path.split('.')[-1:][0] in ['png','jpg','jpeg']: #if path isn't a image file,return
return
if os.path.isdir(path):
return
##########transform img to progressive
img = Image.open(path)
destination = path.split('.')[:-1][0]+'_destination.'+path.split('.')[-1:][0]
try:
print(path.split('\\')[-1:][0],'开始转换图片')
img.save(destination, "JPEG", quality=80, optimize=True, progressive=True) #转换就是直接另存为
print(path.split('\\')[-1:][0],'转换完毕')
except IOError:
PIL.ImageFile.MAXBLOCK = img.size[0] * img.size[1]
img.save(destination, "JPEG", quality=80, optimize=True, progressive=True)
print(path.split('\\')[-1:][0],'转换完毕')
print('开始重命名文件')
os.remove(path)
os.rename(destination,path)
for d,_,fl in os.walk(os.getcwd()): #遍历目录下所有文件
for f in fl:
try:
imgToProgressive(d+'\\'+f)
except:
pass
以上介绍了使用Python进行图片批量压缩和尺寸调整的具体实现。通过灵活调整参数,可以适应不同场景下的图片优化需求。更多关于Python图像处理的技术细节,可参考本站其他相关文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









