png转jpg,并提高jpg图片质量

问题来源:投简历时让上传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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值