Python/PIL调整文件夹中的所有图像

use*_*883 17 python python-imaging-library

我有以下代码,我认为会调整指定路径中的图像但是当我运行它时,没有任何作用,但python不会抛出任何错误,所以我不知道该怎么做.请指教.谢谢.

from PIL import Image
import os, sys

path = ('C:\Users\Maxxie\color\complete')

def resize():
for item in os.listdir(path):
    if os.path.isfile(item):
        im = Image.open(item)
        f, e = os.path.splitext(item)
        imResize = im.resize((200,200), Image.ANTIALIAS)
        imResize.save(f + ' resized.jpg', 'JPEG', quality=90)

resize()
Run Code Online (Sandbox Code Playgroud)

San*_*one 36

#!/usr/bin/python
from PIL import Image
import os, sys

path = "/root/Desktop/python/images/"
dirs = os.listdir( path )

def resize():
    for item in dirs:
        if os.path.isfile(path+item):
            im = Image.open(path+item)
            f, e = os.path.splitext(path+item)
            imResize = im.resize((200,200), Image.ANTIALIAS)
            imResize.save(f + ' resized.jpg', 'JPEG', quality=90)

resize()
Run Code Online (Sandbox Code Playgroud)

您的错误属于文件的完整路径.而不是item必须是path + item

  • 非常正确..我的路径为路径=('C:\ Users\Maxxie\color\complete')而不是`path =('C:\ Users\Maxxie\color\complete \\')`所以现在一切按预期工作......非常感谢 (4认同)
  • 您确实应该使用`os.path.join()`而不是使用简单的串联。到那时,您也不需要在路径分隔符中使用`path`结尾。 (2认同)

Joh*_*ips 7

如果您想保持图像的相同纵横比,您可以使用此脚本。

from PIL import Image
import os, sys

path = "/path/images/"
dirs = os.listdir( path )
final_size = 244;

def resize_aspect_fit():
    for item in dirs:
         if item == '.DS_Store':
             continue
         if os.path.isfile(path+item):
             im = Image.open(path+item)
             f, e = os.path.splitext(path+item)
             size = im.size
             ratio = float(final_size) / max(size)
             new_image_size = tuple([int(x*ratio) for x in size])
             im = im.resize(new_image_size, Image.ANTIALIAS)
             new_im = Image.new("RGB", (final_size, final_size))
             new_im.paste(im, ((final_size-new_image_size[0])//2, (final_size-new_image_size[1])//2))
             new_im.save(f + 'resized.jpg', 'JPEG', quality=90)
resize_aspect_fit()
Run Code Online (Sandbox Code Playgroud)


siv*_*ivi 5

扩展 @Sanjar Stone 的出色解决方案

为了包含子文件夹并避免 DS 警告,您可以使用 glob 库:

from PIL import Image
import os, sys
import glob

root_dir = "/.../.../.../"


for filename in glob.iglob(root_dir + '**/*.jpg', recursive=True):
    print(filename)
    im = Image.open(filename)
    imResize = im.resize((28,28), Image.ANTIALIAS)
    imResize.save(filename , 'JPEG', quality=90)
Run Code Online (Sandbox Code Playgroud)


And*_* M. 5

John Ottenlips 的解决方案在顶部/底部创建了带有黑色边框的图片,我认为是因为他使用了

  Image.new("RGB", (final_size, final_size))
Run Code Online (Sandbox Code Playgroud)

即使原始图片不是正方形,它也会创建一个以 final_size 为维度的方形新图像。

这解决了问题,并且在我看来,使解决方案更加清晰:

from PIL import Image
import os

path = "C:/path/needs/to/end/with/a/"
resize_ratio = 0.5  # where 0.5 is half size, 2 is double size

def resize_aspect_fit():
    dirs = os.listdir(path)
    for item in dirs:
        if item == '.jpg':
            continue
        if os.path.isfile(path+item):
            image = Image.open(path+item)
            file_path, extension = os.path.splitext(path+item)

            new_image_height = int(image.size[0] / (1/resize_ratio))
            new_image_length = int(image.size[1] / (1/resize_ratio))

            image = image.resize((new_image_height, new_image_length), Image.ANTIALIAS)
            image.save(file_path + "_small" + extension, 'JPEG', quality=90)


resize_aspect_fit()
Run Code Online (Sandbox Code Playgroud)