批量修改图片的 DPI

最近经常需要批量修改图片的 DPI,原以为有很多软件可以做到,谁知找了几个都只有批量修改图片尺寸等功能,而不能批量修改 DPI,于是查了一些资料,自己写了一个 Python 脚本,在这儿记录分享一下。

什么是图片的 DPI

DPI 是“Dots Per Inch”的缩写,直译为“每英寸点数”,表示每英寸长度中的点数或像素数。DPI 通常用于打印和扫描场景,在打印和扫描过程中,DPI 值越高,图像的分辨率和质量越好。

在计算机显示屏上查看图像时,我们通常关注的是 PPI(Pixels Per Inch,每英寸像素),它表示屏幕上每英寸的像素数。PPI 值越高,屏幕上显示的图像质量越好,细节和清晰度也越高。

DPI 和 PPI 有时都被翻译为“分辨率”,其实它们是两个不同的概念。我们平时在电脑或手机上查看图片时,接触得比较多的是 PPI,比如说一张图片的分辨率是 1024*768,说的就是 PPI,表示它在显示器上显示时宽度是 1024 像素,高度是 768 像素。而 DPI 则是一个单独的数字,比如 72、300 等等。一般 Web 上的图片常见的 DPI 是 72,用于高清打印的图片一般要求 DPI 是 300。

一张 PPI 是 1024*768 的图片,它的 DPI 可以是 72,可以是 300,也可以是其他值,DPI 不会影响图片在电脑或手机屏幕上显示的效果,不过在打印时,内容和尺寸相同的图片,DPI 越高打印出来的尺寸越小,不过相应地清晰度会更高。

简单来说,可以这样理解,对同一张图片来说,它包含的信息是固定的,DPI 越低,打印时尺寸就越大,就像在屏幕上将它放大了看一样,自然就会显得模糊,而 DPI 越高,打印时尺寸越小,就像把图片缩小了看一样,自然就会显得清晰。

不同 DPI 设置在打印时的尺寸换算公式如下:

\[尺寸(英寸)= 分辨率(像素)/ DPI(每英寸点数)\]

因此,当 DPI 为 72 时,打印尺寸为:

  • 水平尺寸:1024 像素 / 72 DPI = 14.22 英寸
  • 垂直尺寸:768 像素 / 72 DPI = 10.67 英寸

当 DPI 为 300 时,打印尺寸为:

  • 水平尺寸:1024 像素 / 300 DPI = 3.41 英寸
  • 垂直尺寸:768 像素 / 300 DPI = 2.56 英寸

尽管打印尺寸有所不同,但图像的实际像素分辨率(1024×768)保持不变。

脚本

DPI 信息通常存储在图片文件的元数据中,通过 Python + PIL 库,我们可以很方便地修改图片的 DPI 值。

下面是我写的批量修改图片 dpi 的 Python 脚本:

import argparse
import os

from PIL import Image


def batch_set_dpi(input_dir, dpi, start_number):
    input_folder = input_dir
    output_folder = f"{input_dir}_dpi_{dpi}"

    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    image_files = [f for f in os.listdir(input_folder) if f.split(".")[-1].lower() in ["jpg", "jpeg", "png"]]
    total_images = len(image_files)
    processed_images = 0

    for file_name in image_files:
        input_path = os.path.join(input_folder, file_name)
        output_file_name = f"{start_number:03d}.jpg"
        output_path = os.path.join(output_folder, output_file_name)

        with Image.open(input_path) as img:
            img.save(output_path, format="JPEG", dpi=(dpi, dpi), quality=100)

        processed_images += 1
        start_number += 1
        progress = (processed_images / total_images) * 100
        print(f"Processed {processed_images}/{total_images} images ({progress:.2f}%).")


def main():
    parser = argparse.ArgumentParser(description="Batch set DPI of images in a folder.")
    parser.add_argument("dir", help="The input folder containing images.")
    parser.add_argument("--dpi", type=int, default=300, help="The target DPI value (default: 300)")
    parser.add_argument("--start_number", type=int, default=1, help="The starting number for output image filenames (default: 1)")

    args = parser.parse_args()

    batch_set_dpi(args.dir, args.dpi, args.start_number)


if __name__ == "__main__":
    main()

其中最核心的部分其实只有一句:

img.save(output_path, format="JPEG", dpi=(dpi, dpi), quality=100)

其余部分都是处理参数、遍历文件、保存文件等操作。

用法很简单,比如将这个文件保存为 dpi.py,随后在命令行中按下面的方式调用即可:

python dpi.py <图片文件夹路径>

回车,脚本就会遍历指定文件夹下的所有图片文件,修改其 DPI 为 300,并保存到新文件夹中,不会覆盖原图。

这个脚本只是为了满足我自己的使用场景写的,功能较为简单,如果你有更复杂的需求,可以自行修改。

分类:编程标签:Python

相关文章:

评论:

暂无评论

发表评论: