问题来源:投简历时让上传jpg格式的图片附件,但我只有png格式的,转换后jpg只有80k,但要求jpg格式大于200k,因为png是无损压缩,已有的png图片>200k,但jpg是有损压缩,转换后<200k,所以需要提高jpg质量达到大小要求。
用到的函数:
os.path.splitext(“文件路径”)
: 获得不带后缀的文件路径与文件后缀,返回元组,如print(os.path.splitext(r'C:\Users\image\img.png'))
,返回('C:\\Users\\image\\img', '.png')
,可做分片操作,用于获得文件格式。
os.path.split(“文件路径”)
:获得文件路径与文件名,返回元组,如print(os.path.splitext('C:\Users\image\img.png))
,返回('C:\\Users\\image', 'img.png')
,可做分片操作,用于获得文件路径与文件名。
代码如下:
import os
from PIL import Image
# 获取指定目录下的所有png图片
def get_all_png_files(dir):
files_list = []
for root, dirs, files in os.walk(dir):
for file in files:
if os.path.splitext(file)[1] == '.png': # 如果文件后缀为png加入到列表
files_list.append(os.path.join(root, file))
return files_list
# 打开现有的 PNG 图像
file_dir = r'C:\Users\image' # 文件夹
file_list = get_all_png_files(file_dir) # 得到文件夹下的文件列表
# 遍历文件列表下的文件
for file in file_list:
input_image = Image.open(file) # 获得png图像
target_size = 200 * 1024 # 目标文件大小(200KB = 200 * 1024 字节)
# 转换文件png到jpg
jpg_file_path = os.path.splitext(file)[0] + '.jpg' # 生成jpg文件路径
input_image.convert('RGB').save(jpg_file_path) # 将png转换成jpg并保存
jpg_image = Image.open(jpg_file_path) # 得到jpg文件
jpg_image_size = os.path.getsize(jpg_file_path) # 获得jpg文件大小
print(f'目前{os.path.split(jpg_file_path)[1]}图片大小为{round(jpg_image_size / 1024, 2)}k') # 打印目前jpg文件大小
# 循环,逐渐增加 JPEG 质量,直到达到目标文件大小break
while True:
# 如果jpg大小<目标大小
if jpg_image_size < target_size:
quality = 90 # 初始图片质量,可调整
# 增加图片大小直到>目标大小
while jpg_image_size < target_size:
jpg_image.save(jpg_file_path, quality=quality) # 保存JPEG图像时指定质量级别
jpg_image_size = os.path.getsize(jpg_file_path) # 获取新保存的图像文件大小
print(
f'调整后{os.path.split(jpg_file_path)[1]}图片大小为{round(jpg_image_size / 1024, 2)}k,质量级别:{quality}') # 打印目前jpg文件大小
# 增加JPEG质量
quality += 5 # 可以根据需要调整增加的幅度
# 如果图像大小已经大于或等于目标大小,直接保存
else:
jpg_image.save(jpg_file_path)
print(f'{os.path.split(jpg_file_path)[1]} Finish!')
print('------------------------------------------')
break