调整目录中的图像大小

6 投票
6 回答
13058 浏览
提问于 2025-04-15 12:30

我有一个文件夹,里面全是图片,我想把这些图片的大小调整到原来的大约60%。

我该怎么做呢?可以用Python或者Perl来实现。

谢谢!

Eef

6 个回答

10

可以用shell吗?

mkdir resized
for a in *.jpg; do convert "$a" -resize 60% resized/"$a"; done

如果你有超过一个核心,可以这样做:

find . -maxdepth 1 -type f -name '*.jpg' -print0 | xargs -0 -P3 -I XXX convert XXX -resize 60% resized/XXX

-P3的意思是你想同时处理最多3张图片(也就是并行处理)。

如果你不需要保留原始图片,可以用mogrify,但我更喜欢用convert,然后再用rm ...; mv ...,这样做是为了保险起见,以防万一调整大小失败。

17

如果你想通过编程的方式来处理这个问题,我想你是这个意思,可以使用PIL库来调整图片大小,比如:

newIm = im.resize((newW, newH)

然后把调整后的图片保存到同一个文件或者新的位置。

接着,遍历文件夹中的所有文件,递归地对每一张图片应用调整大小的功能。

我写了一个示例脚本,我觉得这个脚本可以满足你的需求。你可以在这个基础上进行改进:比如可以做成图形界面,增加更多选项,比如保持相同的文件格式,或者只处理所有的png格式,调整大小时使用不同的采样方式,比如线性或双线性等。

import os
import sys
from PIL import Image

def resize(folder, fileName, factor):
    filePath = os.path.join(folder, fileName)
    im = Image.open(filePath)
    w, h  = im.size
    newIm = im.resize((int(w*factor), int(h*factor)))
    # i am saving a copy, you can overrider orginal, or save to other folder
    newIm.save(filePath+"copy.png")

def bulkResize(imageFolder, factor):
    imgExts = ["png", "bmp", "jpg"]
    for path, dirs, files in os.walk(imageFolder):
        for fileName in files:
            ext = fileName[-3:].lower()
            if ext not in imgExts:
                continue

            resize(path, fileName, factor)

if __name__ == "__main__":
    imageFolder=sys.argv[1] # first arg is path to image folder
    resizeFactor=float(sys.argv[2])/100.0# 2nd is resize in %
    bulkResize(imageFolder, resizeFactor)
11

你可以试试使用 mogrify,这个工具是 ImageMagick 的一部分。如果你真的需要通过 Perl 来控制这个过程,那么你可以使用 Image::MagickImage::Resize 或者 Imager 这些库。

撰写回答