t880 发表于 2024-6-14 00:19:33

【自制python脚本】图片尺寸缩放工具

本帖最后由 t880 于 2024-6-14 00:42 编辑

我们在使用某些网站的功能时,有时候会遇到上传图片会限制图片宽高的问题,比如我最近在做漫画机翻的时候就遇到了限制宽高4000,但手中有一大批图片,想按比例批量缩放到以最长边为设定值的图片,就比较麻烦,所以写了这个脚本用于对指定目录下图片文件做缩放的功能杂杂念:有很多小工具(比如美图秀秀批量处理等等)在 windows 都可以做到,但是如果换了系统就很不是很容易有,在Mac上WPS还要会员,实在是为了一个小功能给不起这个钱。

调用方式
python resize.py {路径} {最长边}


功能说明

1. 支持相对路径和绝对路径
2. 图片终会被缩放到最长边为指定参数的尺寸(同一批图片统一尺寸,看漫画时不会出现一大一小的尺寸变化)
3. 生成的新图片会在同目录下以 resize_ 开头存在
脚本内容



import argparse
from PIL import Image
import os

Image.MAX_IMAGE_PIXELS = None


def resize_images(directory, max_size):
    # 将目录路径转换为绝对路径
    directory = os.path.abspath(directory)

    # 遍历目录中的图像文件
    for filename in os.listdir(directory):
      file_path = os.path.join(directory, filename)

      # 检查文件是否为图像文件
      if os.path.isfile(file_path) and filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')):

            if filename.startswith('resize_') or os.path.exists(os.path.join(directory, f"resize_{filename}")):
                print(f"Skipping {filename}...")
                continue

            # 打开图像文件
            image = Image.open(file_path)

            # 获取图像的宽度和高度
            width, height = image.size

            # 计算缩放比例
            if width > height:
                scale_factor = max_size / width
            else:
                scale_factor = max_size / height

            # 计算缩小后的尺寸
            new_width = int(width * scale_factor)
            new_height = int(height * scale_factor)
            new_size = (new_width, new_height)

            # 缩小图像
            resized_image = image.resize(new_size, Image.LANCZOS)

            # 构造输出文件路径
            output_filename = f"resize_{filename}"
            output_path = os.path.join(directory, output_filename)

            # 保存缩小后的图像
            resized_image.save(output_path)

            # 关闭图像文件
            image.close()

if __name__ == '__main__':
    # 创建解析器并定义命令行参数
    parser = argparse.ArgumentParser(description='Batch resize images.')
    parser.add_argument('directory', help='Directory path (relative or absolute)')
    parser.add_argument('max_size', type=int, help='Maximum size for the longest edge')

    # 解析命令行参数
    args = parser.parse_args()

    # 调用函数进行图像批量缩小
    resize_images(args.directory, args.max_size)
ansuir@Ansuirs-Mac-Mini ~/D/C/t/蜘蛛侠篇> python3 resize.py . 4000^C
ansuir@Ansuirs-Mac-Mini ~/D/C/t/蜘蛛侠篇> open .
ansuir@Ansuirs-Mac-Mini ~/D/C/t/蜘蛛侠篇> python3 resize.py . 4000
cc^CTraceback (most recent call last):
File "resize.py", line 63, in <module>
    resize_images(args.directory, args.max_size)
File "resize.py", line 41, in resize_images
    resized_image = image.resize(new_size, Image.LANCZOS)
File "/usr/local/lib/python3.8/site-packages/PIL/Image.py", line 2185, in resize
    self.load()
File "/usr/local/lib/python3.8/site-packages/PIL/ImageFile.py", line 291, in load
    n, err_code = decoder.decode(b)
KeyboardInterrupt
^C⏎                                                                                                                                                                                                                                                            ansuir@Ansuirs-Mac-Mini ~/D/C/t/蜘蛛侠篇> python3 resize.py ./test/ 4000
ansuir@Ansuirs-Mac-Mini ~/D/C/t/蜘蛛侠篇> cat resize.py
import argparse
from PIL import Image
import os

Image.MAX_IMAGE_PIXELS = None


def resize_images(directory, max_size):
    # 将目录路径转换为绝对路径
    directory = os.path.abspath(directory)

    # 遍历目录中的图像文件
    for filename in os.listdir(directory):
      file_path = os.path.join(directory, filename)

      # 检查文件是否为图像文件
      if os.path.isfile(file_path) and filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')):

            if filename.startswith('resize_') or os.path.exists(os.path.join(directory, f"resize_{filename}")):
                print(f"Skipping {filename}...")
                continue

            # 打开图像文件
            image = Image.open(file_path)

            # 获取图像的宽度和高度
            width, height = image.size

            # 计算缩放比例
            if width > height:
                scale_factor = max_size / width
            else:
                scale_factor = max_size / height

            # 计算缩小后的尺寸
            new_width = int(width * scale_factor)
            new_height = int(height * scale_factor)
            new_size = (new_width, new_height)

            # 缩小图像
            resized_image = image.resize(new_size, Image.LANCZOS)

            # 构造输出文件路径
            output_filename = f"resize_{filename}"
            output_path = os.path.join(directory, output_filename)

            # 保存缩小后的图像
            resized_image.save(output_path)

            # 关闭图像文件
            image.close()

if __name__ == '__main__':
    # 创建解析器并定义命令行参数
    parser = argparse.ArgumentParser(description='Batch resize images.')
    parser.add_argument('directory', help='Directory path (relative or absolute)')
    parser.add_argument('max_size', type=int, help='Maximum size for the longest edge')

    # 解析命令行参数
    args = parser.parse_args()

    # 调用函数进行图像批量缩小
    resize_images(args.directory, args.max_size)



库依赖
>pip3 install Pillow
>pip3 install argparse


阿睿 发表于 2024-6-14 00:29:47

简直太实用了,感谢楼主分享

黑夜下的灯光 发表于 2024-6-14 00:30:49

感觉非常实用的脚本呢,在很多方面都能用得上呢

凯诺斯 发表于 2024-6-14 00:32:48

看起来很不错的脚本惹,试试看效果如何:loveliness:

vander 发表于 2024-6-14 00:36:01

直接编译成executable会方便一些,不然还要装py

威风妖怪麒麟 发表于 2024-6-14 00:36:06

这个方法需要PC上面事先安装了python吧

xvyi 发表于 2024-6-14 00:36:19

虽然对我发帖有帮助,但我意识到我确实是计算机语言废物

提尔特 发表于 2024-6-14 00:36:22

好强大的功能 我先收藏起来 {:6_200:}

娱乐法师火布偶 发表于 2024-6-14 00:55:50

精细的调整我可能会使用PS更多一些

M小黑 发表于 2024-6-14 01:24:21

还是喜欢用PS,不过python小脚本确实也很方便,感谢楼主分享

ditto 发表于 2024-6-14 01:28:15

感觉非常适合发帖前编辑一下,感谢分享

White_sky 发表于 2024-6-14 07:13:20

好简单实用的工具,感谢楼主

you9632587 发表于 2024-6-14 08:57:44

很方便习惯用mac的坛友啊,我一直都是用的win自带的看图软件的压缩功能

Ullnllmll 发表于 2024-6-14 09:16:40

:hug:呜呜,谢谢分享~我突然想到我的图片都直接拿的原始尺寸,有点丑丑的

Riverlethe 发表于 2024-6-14 10:29:47

我太懒了,直接都是照搬的,懒得修改都{:6_164:}
最多就是丢到图画里,然后修改下尺寸

land动了 发表于 2024-6-14 11:05:08

好简洁的方法,太好了!{:6_167:}

silencedonkey 发表于 2024-6-14 11:17:24

感觉这个还是比较基础的python应用了,楼主的代码怎么连输出都包含在内了,好像还写了两遍,建议检查一下

狼兀 发表于 2024-6-14 12:39:17

我记得python cv2中也有调整图片尺寸的函数resize。
又是学习新技术的一天。

li漠北 发表于 2024-6-14 12:39:37

上班有时候处理文件需要,主要还是看漫画方便了很多很多

feng1997817 发表于 2024-6-14 13:47:54

很实用,虽然网页可以改,但是用这个更方便
页: [1] 2 3
查看完整版本: 【自制python脚本】图片尺寸缩放工具