简体   繁体   English

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

[英]Python/PIL Resize all images in a folder

I have the following code that I thought would resize the images in the specified path But when I run it, nothing works and yet python doesn't throw any error so I don't know what to do.我有以下代码,我认为它会调整指定路径中图像的大小但是当我运行它时,没有任何效果,但 python 没有抛出任何错误所以我不知道该怎么做。 Please advise.请指教。 Thanks.谢谢。

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()
#!/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()

Your mistake is belong to full path of the files.您的错误属于文件的完整路径。 Instead of item must be path+item而不是项目必须是路径+项目

In case you want to keep the same aspect ratio of the image you can use this script.如果您想保持图像的相同纵横比,您可以使用此脚本。

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()

John Ottenlips's solution created pictures with black borders on top/bottom i think because he used John Ottenlips 的解决方案在顶部/底部创建了带有黑色边框的图片,我认为是因为他使用了

  Image.new("RGB", (final_size, final_size))

which creates a square new image with the final_size as dimension, even if the original picture was not a square.即使原始图片不是正方形,它也会创建一个以 final_size 为维度的方形新图像。

This fixes the problem and, in my opinion, makes the solution a bit clearer:这解决了问题,并且在我看来,使解决方案更加清晰:

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()

Expanding on the great solution of @Sanjar Stone扩展@Sanjar Stone 的出色解决方案

for including subfolders and also avoid DS warnings you can use the glob library:为了包含子文件夹并避免 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)

This code just worked for me to resize images..此代码仅适用于我调整图像大小..

from PIL import Image
import glob
import os

# new folder path (may need to alter for Windows OS)
# change path to your path
path = 'yourpath/Resized_Shapes' #the path where to save resized images
# create new folder
if not os.path.exists(path):
    os.makedirs(path)

# loop over existing images and resize
# change path to your path
for filename in glob.glob('your_path/*.jpg'): #path of raw images
    img = Image.open(filename).resize((306,306))
    # save resized images to new folder with existing filename
    img.save('{}{}{}'.format(path,'/',os.path.split(filename)[1]))

For those that are on Windows:对于那些在 Windows 上的人:

from PIL import Image
import glob

image_list = []
resized_images = []

for filename in glob.glob('YOURPATH\\*.jpg'):
    print(filename)
    img = Image.open(filename)
    image_list.append(img)

for image in image_list:
    image = image.resize((224, 224))
    resized_images.append(image)

for (i, new) in enumerate(resized_images):
    new.save('{}{}{}'.format('YOURPATH\\', i+1, '.jpg'))

Heavily borrowed the code from @Sanjar Stone.大量借用了@Sanjar Stone 的代码。 This code work well in Windows OS.此代码在 Windows 操作系统中运行良好。 Can be used to bulky resize the images and assembly back to its corresponding subdirectory.可用于将图像和程序集调整回其相应的子目录。

Original folder with it subdir:
..\DATA\ORI-DIR
├─Apolo
├─Bailey
├─Bandit
├─Bella

New folder with its subdir:带有子目录的新文件夹:

..\DATA\NEW-RESIZED-DIR
├─Apolo
├─Bailey
├─Bandit
├─Bella

Gist link: https://gist.github.com/justudin/2c1075cc4fd4424cb8ba703a2527958b要点链接: https : //gist.github.com/justudin/2c1075cc4fd4424cb8ba703a2527958b

from PIL import Image
import glob
import os

# new folder path (may need to alter for Windows OS)
# change path to your path
ORI_PATH = '..\DATA\ORI-DIR'
NEW_SIZE = 224
PATH = '..\DATA\NEW-RESIZED-DIR' #the path where to save resized images

# create new folder
if not os.path.exists(PATH):
    os.makedirs(PATH)

# loop over existing images and resize
# change path to your path
for filename in glob.glob(ORI_PATH+'**/*.jpg'): #path of raw images with is subdirectory
    img = Image.open(filename).resize((NEW_SIZE,NEW_SIZE))
    
    # get the original location and find its subdir
    loc = os.path.split(filename)[0]
    subdir = loc.split('\\')[1]
    
    # assembly with its full new directory
    fullnew_subdir = PATH+"/"+subdir
    name = os.path.split(filename)[1]
    
    # check if the subdir is already created or not
    if not os.path.exists(fullnew_subdir):
        os.makedirs(fullnew_subdir)
    
    # save resized images to new folder with existing filename
    img.save('{}{}{}'.format(fullnew_subdir,'/',name))

Expanded the answer of Andrei M. In order to only change the height of the picture and automatically size the width.扩展了 Andrei M 的答案。为了只改变图片的高度并自动调整宽度。

from PIL import Image
import os

path = "D:/.../.../.../resized/"
dirs = os.listdir(path)

def resize():
    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)
            size = image.size

            new_image_height = 190
            new_image_width = int(size[1] / size[0] * new_image_height)

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


resize()

If you want to resize any image from a folder where without images files, other files also exist, then you can try this:如果您想从没有图像文件的文件夹中调整任何图像的大小,其他文件也存在,那么您可以试试这个:

from genericpath import isdir
from PIL import Image
import os, sys

path = "C://...//...//....//...//"
save_path = "C://...//..//...//...//"
images = os.listdir(path)

if not os.path.isdir(save_path):
    os.makedirs(save_path)


for image in images:
    image_path = os.path.join(path, image)
    iamge_save_path = os.path.join(save_path, image)
    if image.split(".")[1] not in ["jpg", "png"]:
        continue
    if os.path.exists(image_path):
        im = Image.open(image_path)
        image_resized = im.resize((224,224))
        image_resized.save(iamge_save_path, quality=90)
        # print("saved")

Safer to use pathlib使用pathlib更安全

As jwal commented on a similar question , use the object-oriented counterparts for os of pathlib :正如jwal 对类似问题的评论,使用面向对象os of pathlib

from pathlib import Path

# folder = 'images'
# new_dimension = (width, height)
def resize(folder, new_dimension, new_subdir):
    
    images_folder = Path(folder)
    for child in images_folder.iterdir():
        print("Found image:", child)
        image_path = child.absolute()

        image = Image.open(image_path)
        resized_image = image.resize()  # could also add Image.ANTIALIAS

        # create if the subdir not exists
        subdir = images_folder.join(new_subdir)
        if not subdir.exists():
            subdir.mkdir(parents=True, exist_ok=True)
        
        to_path = subdir.joinpath(child.name)  # join adds the path-separators
        print("Saving resized to:", to_path)
        resized_image.save(to_path)  # could also add save-options like 'JPEG', quality=90

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM