需求场景
摄影网站发过来很多 1920*2880 的高清图片,基本每个图片都是 1MB 以上,由于网页浏览时图片过大,加载太慢,主要进行图片批量压缩处理,同时对图片进行有规律的命名!
需求分析
- 批量图片压缩;
- 有规律的命名!
解决方案
本文采用 PIL 进行图片压缩处理!
导入包和创建公共变量
- filePath 源文件所在文件夹路径
- fileNewPath 压缩后新文件保存的文件夹路径
- scale 缩放比例
- quality 初始压缩比率
from PIL import Image
import os
import time
filePath = '/mine0/mine1/'
fileNewPath = filePath + 'newimg/'
scale = 0.2
quality = 100
读取文件夹下所有文件
def readname():
names = None
try:
names = os.listdir(filePath)
except Exception as e:
print(e)
print('获取文件名列表失败!')
else:
print('获取文件名列表成功!')
return names
对刷选文件做压缩处理
- 处理开始时间用于计算本次压缩所有的时间;
- 获取原始文件的文件名称列表;
- 循环读取列表获取文件名称;
- 筛选需要压缩的文件;
- 读取当前筛选文件;
- 获取当前图片的宽高;
- 按照比例计算压缩后宽高 scale;
- 修改图片尺寸;
- 按照 quality 比率进行压缩保存到对应路径;
- 注意图片名字是从1开始,刷选多少符合要求,保存一张依次递增;
- 最后计算本次压缩的时间。
def loopHandleFile():
start = time.time()
startTime = int(round(start * 1000))
names = readname()
index = 1
try:
for name in names:
if('A---' in name):
img = Image.open(filePath + name)
w,h = img.size
w,h = round(w * scale),round(h * scale)
img = img.resize((w,h), Image.ANTIALIAS)
img.save(fileNewPath + str(index) + '.jpg', optimize = True, quality = quality)
index = index + 1
except Exception as e:
print(e)
print('批量等比压缩图片失败!')
else:
print('批量等比压缩图片成功!')
end = time.time()
endTime = int(round(end * 1000))
print('本次压缩用时:' + str(endTime - startTime) + ' ms')
压缩前图片
基本都是接近1MB左右;
压缩后图片
全部压缩,按照代码中0.2的100,大概有9倍!
完整代码
"""
@Author :Rattenking
@Date :2021/02/09 10:27
@CSDN :https://blog.csdn.net/m0_38082783
"""
from PIL import Image
import os
import time
filePath = '/mine0/mine1/'
fileNewPath = filePath + 'newimg/'
scale = 0.2
quality = 100
def readname():
names = None
try:
names = os.listdir(filePath)
except Exception as e:
print(e)
print('获取文件名列表失败!')
else:
print('获取文件名列表成功!')
return names
def loopHandleFile():
start = time.time()
startTime = int(round(start * 1000))
names = readname()
index = 1
try:
for name in names:
if('A---' in name):
img = Image.open(filePath + name)
w,h = img.size
w,h = round(w * scale),round(h * scale)
img = img.resize((w,h), Image.ANTIALIAS)
img.save(fileNewPath + str(index) + '.jpg', optimize = True, quality = quality)
index = index + 1
except Exception as e:
print(e)
print('批量等比压缩图片失败!')
else:
print('批量等比压缩图片成功!')
end = time.time()
endTime = int(round(end * 1000))
print('本次压缩用时:' + str(endTime - startTime) + ' ms')
if __name__ == "__main__":
loopHandleFile()
执行代码和结果
PS H:\mine0\mine1> python compressImg.py
获取文件名列表成功!
批量等比压缩图片成功!
本次压缩用时:7662 ms
优化
- 动态获取当前脚本的执行路径;
- 健壮代码,判断图片压缩后的保存路径是否存在;
- 如果有需求需要,可以在保存时,添加删除源文件代码(此处谨慎操作,可能你压缩后的文件不满,需重新压缩。所以我没有删除源文件)。
优化后完整代码
"""
@Author :Rattenking
@Date :2021/02/09 10:27
@CSDN :https://blog.csdn.net/m0_38082783
"""
from PIL import Image
import os
import time
filePath = os.path.dirname(os.path.abspath(__file__)) + '/'
fileNewPath = filePath + 'newimg/'
scale = 0.2
quality = 100
# 获取当前文件夹下的文件名列表
def readname():
names = None
try:
names = os.listdir(filePath)
except Exception as e:
print(e)
print('获取文件名列表失败!')
else:
print('获取文件名列表成功!')
return names
# 修改文件尺寸和压缩文件
def withDataImage(names):
index = 1
for name in names:
if('A---' in name):
img = Image.open(filePath + name)
w,h = img.size
w,h = round(w * scale),round(h * scale)
img = img.resize((w,h), Image.ANTIALIAS)
img.save(fileNewPath + str(index) + '.jpg', optimize = True, quality = quality)
index = index + 1
# 压缩时间的计算
def loopHandleFile():
start = time.time()
startTime = int(round(start * 1000))
names = readname()
try:
if not os.path.exists(fileNewPath):
os.makedirs(fileNewPath)
withDataImage(names)
except Exception as e:
print(e)
print('批量等比压缩图片失败!')
else:
print('批量等比压缩图片成功!')
end = time.time()
endTime = int(round(end * 1000))
print('本次压缩用时:' + str(endTime - startTime) + ' ms')
if __name__ == "__main__":
loopHandleFile()
总结
- 脚本总是在需求的增多不断完善;
- 尽量使自己的代码更加健壮;
- 尽量使每个方法只做一件事!