簡體   English   中英

Python/PIL 調整文件夾中所有圖像的大小

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

我有以下代碼,我認為它會調整指定路徑中圖像的大小但是當我運行它時,沒有任何效果,但 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()
#!/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()

您的錯誤屬於文件的完整路徑。 而不是項目必須是路徑+項目

如果您想保持圖像的相同縱橫比,您可以使用此腳本。

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 的解決方案在頂部/底部創建了帶有黑色邊框的圖片,我認為是因為他使用了

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

即使原始圖片不是正方形,它也會創建一個以 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()

擴展@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)

此代碼僅適用於我調整圖像大小..

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

對於那些在 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'))

大量借用了@Sanjar Stone 的代碼。 此代碼在 Windows 操作系統中運行良好。 可用於將圖像和程序集調整回其相應的子目錄。

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

帶有子目錄的新文件夾:

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

要點鏈接: 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))

擴展了 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()

如果您想從沒有圖像文件的文件夾中調整任何圖像的大小,其他文件也存在,那么您可以試試這個:

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

使用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