14

批量修改图片的 DPI

 1 year ago
source link: https://oldj.net/article/2023/06/05/batch-change-dpi/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近经常需要批量修改图片的 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(每英寸点数)尺寸(英寸)=分辨率(像素)/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,并保存到新文件夹中,不会覆盖原图。

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


Recommend

  • 26

    程序员 - @jingyulong - 可以修改图片分辨率,修改 PPI,顺带压缩,可以选择压缩质量。

  • 50
    • 36氪 36kr.com 5 years ago
    • Cache

    谁该为DPI买单?

    GP和LP,谁才是DPI产生的第一责任人?

  • 22
    • www.cnblogs.com 4 years ago
    • Cache

    node实现批量修改图片尺寸

    前言 大家在工作中肯定有没有遇到过图片尺寸和我们要求的尺寸不一致的情况吧?通常我们会在网上找一下找在线的或者下载一个小工具,再或者通过 ps 的批处理解决。但是,作为 程序猿 ,当然还是通过...

  • 10
    • wok.oblomov.eu 4 years ago
    • Cache

    Mixed DPI

    Mixed DPI and the X Window Systemwok/ tecnologia/ Mixed DPI and the X Window System I'm writing this article because I'm getting ti...

  • 15

    Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32) 发布于 2018-10-18 10:06 更新于 2021-01-04 12:33 ...

  • 8

    批量修改图片大小的 Matlab 脚本 作者: 张志强 ...

  • 9

    评估GP,只看IRR和DPI远远不够溯元育新41分钟前选取好的PME,才是LP功力的体现。#1 评估基金业绩,通常有4种指标

  • 11

    基于传统技术开发的 Windows 桌面应用,在高分辨率的显示设备上表现得“惨不忍睹”。随着高分辨率显示设备的普及,所有桌面应用程序的开发人员,都需要关注自己的软件在不同的 DPI 上的表现。 1 应用程序感知 DPI 变化

  • 6
    • zhajiman.github.io 3 years ago
    • Cache

    Matplotlib 系列:导出高 DPI 的图片

    Matplotlib 系列:导出高 DPI 的图片  2021-04-08  2809 words  matplotlib...

  • 6
    • www.chinaventure.com.cn 2 years ago
    • Cache

    DPI太低,有LP批量起诉GP

    DPI太低,有LP批量起诉GP “现在的LP太狠了,基金一到期就起诉清算。” DPI的问题现在有多严重?前一段时间,听到一位圈中大佬倒苦水:现在的LP太狠了,基金一到期就起诉清算。他说,银行理财子公司现在是“批量”起诉GP,有几个朋友的机构“快被...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK