【自制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
简直太实用了,感谢楼主分享 感觉非常实用的脚本呢,在很多方面都能用得上呢 看起来很不错的脚本惹,试试看效果如何:loveliness: 直接编译成executable会方便一些,不然还要装py 这个方法需要PC上面事先安装了python吧 虽然对我发帖有帮助,但我意识到我确实是计算机语言废物 好强大的功能 我先收藏起来 {:6_200:} 精细的调整我可能会使用PS更多一些 还是喜欢用PS,不过python小脚本确实也很方便,感谢楼主分享 感觉非常适合发帖前编辑一下,感谢分享 好简单实用的工具,感谢楼主 很方便习惯用mac的坛友啊,我一直都是用的win自带的看图软件的压缩功能 :hug:呜呜,谢谢分享~我突然想到我的图片都直接拿的原始尺寸,有点丑丑的 我太懒了,直接都是照搬的,懒得修改都{:6_164:}
最多就是丢到图画里,然后修改下尺寸 好简洁的方法,太好了!{:6_167:} 感觉这个还是比较基础的python应用了,楼主的代码怎么连输出都包含在内了,好像还写了两遍,建议检查一下 我记得python cv2中也有调整图片尺寸的函数resize。
又是学习新技术的一天。 上班有时候处理文件需要,主要还是看漫画方便了很多很多 很实用,虽然网页可以改,但是用这个更方便