简单的 Python 批量处理图片 DPI 脚本

简单的 Python 批量处理图片 DPI 脚本

环境准备

在运行脚本之前,请确保安装了Pillow库。命令安装:

pip install Pillow

完整脚本代码

以下脚本实现了批量读取指定文件夹内的图片,修改其 DPI 并保存到新文件夹的功能,同时针对不同图片格式进行了画质优化处理:

import os
from PIL import Image

def batch_change_dpi(input_folder, output_folder, target_dpi=300):
    """
    批量修改图片的DPI(仅修改元数据,不改变像素尺寸)
    
    参数:
        input_folder (str): 输入图片文件夹路径
        output_folder (str): 输出图片文件夹路径
        target_dpi (int/tuple): 目标DPI值,默认为300。若传入整数则水平和垂直DPI相同
    """
    # 规范化DPI参数为元组格式
    if isinstance(target_dpi, int):
        target_dpi = (target_dpi, target_dpi)
        
    # 如果输出文件夹不存在,则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
        
    # 支持的图片格式(注意处理大小写问题)
    supported_formats = {'.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.tif'}
    
    count_ok = 0
    count_skip = 0
    
    print(f"开始处理,目标DPI设置为: {target_dpi[0]} x {target_dpi[1]}...\n")
    
    # 遍历输入文件夹中的所有文件
    for filename in os.listdir(input_folder):
        filepath = os.path.join(input_folder, filename)
        
        # 跳过子文件夹
        if not os.path.isfile(filepath):
            continue
            
        # 统一转为小写判断后缀,避免.JPG等大写后缀被漏掉
        file_ext = os.path.splitext(filename)[1].lower()
        
        if file_ext not in supported_formats:
            count_skip += 1
            continue
            
        try:
            with Image.open(filepath) as img:
                # 构造保存参数
                params = {'dpi': target_dpi}
                
                # 针对JPG格式的特殊画质保护处理
                if file_ext in ('.jpg', '.jpeg'):
                    params['quality'] = 95      # 默认保存质量太低会导致图片变糊,95几乎看不出区别且文件不过大
                    params['subsampling'] = 0   # 保持色彩采样率
                    
                # 针对TIFF格式可选择添加无损压缩
                elif file_ext in ('.tiff', '.tif'):
                    params['compression'] = 'tiff_lzw'
                
                # 生成输出路径并保存
                output_path = os.path.join(output_folder, filename)
                img.save(output_path, **params)
                count_ok += 1
                print(f"✔ 成功: {filename}")
                
        except Exception as e:
            count_skip += 1
            print(f"✘ 失败: {filename} | 原因: {str(e)}")
            
    # 最终统计结果
    print("\n" + "="*40)
    print(f"处理完毕!成功: {count_ok} 张, 跳过/失败: {count_skip} 个")
    print(f"处理后的文件保存在: {os.path.abspath(output_folder)}")
    print("="*40)

if __name__ == "__main__":
    # ===== 在此处修改你的配置 =====
    INPUT_FOLDER = "./input_images"    # 输入文件夹路径(将需要处理的图片放入此文件夹)
    OUTPUT_FOLDER = "./output_images"  # 输出文件夹路径(处理后图片的保存位置)
    TARGET_DPI = 300                   # 目标DPI值(论文/印刷通常用300或600,网页用72或96)
    
    batch_change_dpi(INPUT_FOLDER, OUTPUT_FOLDER, TARGET_DPI)

功能亮点与原理解析

  1. 仅修改元数据,不重采样:此脚本的核心是修改图片的 DPI 元数据信息,而不会改变图像的像素尺寸。DPI(每英寸点数)决定了图像打印时的物理尺寸,公式为:物理尺寸(英寸) = 像素尺寸 / DPI。因此,提高 DPI 值会使图片在打印时物理尺寸变小但更清晰,这在满足论文或出版物的硬性要求时非常实用。

  2. JPG 画质保护机制:直接使用 Pillow 保存 JPG 格式时,若不指定参数,往往会采用默认的较低压缩质量,导致图片明显变糊。脚本中特别加入了quality=95subsampling=0参数,能在修改 DPI 的同时最大程度保留原图画质。

  3. 兼容格式与大小写:脚本在判断文件后缀时统一使用了.lower()转为小写,避免了因系统或相机生成的大写后缀(如.JPG)导致的识别失败问题。

  4. 异常捕获与防占用:加入了try-except块。如果在处理时图片正在被 Photoshop 或其他软件占用,脚本不会崩溃,而是会提示保存失败并继续处理下一张图。

  5. 输出隔离:处理后的图片统一存放在新的输出文件夹中,不会覆盖你的原始文件,确保数据安全。

常见避坑指南

  • 验证 DPI 是否修改成功:在 Windows 系统中,修改完成后,你可以右键点击图片 → 属性 → 详细信息,即可查看到水平和垂直分辨率(DPI)已经变更。

  • DPI 选择建议

    • 150 DPI:适用于普通的网页显示或屏幕预览。

    • 300 DPI:标准打印、论文插图、喷绘海报的及格线。

    • 600 DPI:专业级印刷、高质量线稿图或遥感专题图的推荐设置。

  • 文件占用问题:如果运行报错提示文件无法写入,请检查图片是否在看图软件或 PS 中处于打开状态,关闭后重新运行即可。

Strict WAF - 严格的 Java Web 应用防火墙 2026-04-07
网络攻防纪元:AI驱动攻击的全面爆发与智能防御体系重构 2026-05-28

评论区

© 2026 雨落秋垣