You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python PIL图片缩放后丢失元数据问题求助

解决PIL缩放图片丢失元数据的问题

问题核心是PIL的resize生成的新图像对象不会自动继承原始图片的元数据(如EXIF、ICC配置文件等),需要手动提取并传递给保存方法。以下是修改后的代码,同时完善文件名转小写的逻辑:

import os
from PIL import Image

def resize_images(input_folder, output_folder, width, height):
    # 创建输出目录
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for filename in os.listdir(input_folder):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')):
            input_path = os.path.join(input_folder, filename)
            # 将文件名转为小写
            lower_filename = filename.lower()
            output_path = os.path.join(output_folder, lower_filename)
            
            with Image.open(input_path) as image:
                # 计算缩放后的尺寸,保持宽高比
                aspect_ratio = image.width / float(image.height)
                new_height = int(width / aspect_ratio)
                # 确保不超过目标高度(按需启用)
                if new_height > height:
                    new_height = height
                    width = int(height * aspect_ratio)
                resized_image = image.resize((width, new_height), Image.LANCZOS)
                
                # 提取并整理原始图片的元数据
                save_kwargs = {}
                # 保留DPI
                dpi = image.info.get("dpi", (300, 300))
                save_kwargs['dpi'] = dpi
                # 保留EXIF数据(JPG/JPEG格式常用)
                exif = image.info.get('exif')
                if exif:
                    save_kwargs['exif'] = exif
                # 保留ICC颜色配置文件
                icc_profile = image.info.get('icc_profile')
                if icc_profile:
                    save_kwargs['icc_profile'] = icc_profile
                # 保留PNG的自定义元数据块
                if image.format == 'PNG':
                    for key in image.info:
                        if key not in ('dpi', 'exif', 'icc_profile'):
                            save_kwargs[key] = image.info[key]
                
                # 保存图片并传入所有元数据参数
                resized_image.save(output_path, **save_kwargs)

关键改动说明:

  • 手动传递元数据:从原始image.info中提取exif、icc_profile等核心元数据,在保存时通过关键字参数传入新图像。
  • 明确文件名小写处理:单独生成小写文件名,确保输出文件命名符合需求。
  • 可选尺寸约束:添加高度判断,若按比例计算的高度超出目标值,则切换为以高度为基准缩放,保证图片尺寸不超过760x580范围(可根据实际需求调整)。
  • 多格式适配:针对PNG格式的自定义元数据块做额外处理,覆盖更多场景的元数据保留需求。

注:部分图片格式(如GIF)本身支持的元数据类型有限,上述代码已覆盖主流格式的常用元数据类型。

内容的提问来源于stack exchange,提问作者VeeyesPlus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:05:25