Прочитать все изображения из подпапки, изменить их размер и сохранить их с оригинальным именем в Python? - PullRequest
0 голосов
/ 29 января 2020

Я хочу прочитать все изображения из другой подпапки, изменить их размер и сохранить их с их оригинальным именем. Однако я получаю ошибку, показанную ниже. Как мне исправить эту ошибку, пожалуйста? Кто-нибудь Помогите мне. Спасибо всем))

пример кода:

from PIL import Image

import os

size = (112, 112)

def resize_img(path,dest_path):

    name_list = []
    label_list = []
    resized_list = []
    if not os.path.exists(dest_path):
        os.makedirs(dest_path)
    folder_list = os.listdir(path)
    for num_imgs,folder in enumerate(folder_list):
        print(str(num_imgs) + " : " + folder)
        files_path = path + "/" + folder
        image_list = os.listdir(files_path)
        name_list.append(folder)
        for image_name in image_list:
            image_path = path + "/" + folder + "/" + image_name
            print(image_path)
            img = Image.open(image_path)
            label_list.append(img)
            for image in label_list:
                image = image.resize((112, 112))
                resized_list.append(image)
                for (i,new) in enumerate (resized_list):
                    new.save('{}{}{}'.format(dest_path+'/'+str(label_list)+str('_'), i+1, '.jpg'))

resize_img('C:/Users/aunglay/PycharmProjects/FR_using_cnn/Face_database',
           'C:/Users/aunglay/PycharmProjects/FR_using_cnn/resized_images')

Появилась ошибка:

Трассировка (последний последний вызов):

Файл "C: / Users / aunglay / PycharmProjects / FR_using_cnn / smaple2.py ", строка 30, в 'C: / Users / aunglay / PycharmProjects / FR_using_cnn / resized_images')

Файл" C: / Users / aunglay / PycharmProjects / FR_using_cnn / smaple2.py ", строка 27, в resize_img new.save ('{} {} {}'. Format (dest_path + '/' + str (label_list) + str ('_')), i + 1, '.jpg'))

Файл "C: \ Users \ aunglay \ Anaconda3 \ envs \ensorflow_env \ lib \ site-packages \ PIL \ Image.py", строка 2099, в save fp = builtins.open (имя файла, "w + b") Ошибка OSE: [Errno 22] Недопустимый аргумент: 'C: / Users / aunglay / PycharmProjects / FR_using_cnn / resized_images / [] _ ​​1.jpg'

1 Ответ

0 голосов
/ 29 января 2020

Кажется, проблема в последней строке кода:

new.save('{}{}{}'.format(dest_path+'/'+str(label_list)+str('_'), i+1, '.jpg'))

В частности, label_list будет списком объектов изображения и не будет содержать имя только что прочитанного изображения. Плюс, я думаю, что последние два цикла не нужны. Вы можете изменить код:

for image_name in image_list:
        image_path = path + "/" + folder + "/" + image_name
        print(image_path)
        img = Image.open(image_path)
        label_list.append(img)
        for image in label_list:
            image = image.resize((112, 112))
            resized_list.append(image)
            for (i,new) in enumerate (resized_list):
                new.save('{}{}{}'.format(dest_path+'/'+str(label_list)+str('_'), i+1, '.jpg'))

на:

for image_name in image_list:
        image_path = path + "/" + folder + "/" + image_name
        print(image_path)
        img = Image.open(image_path)
        label_list.append(img)
        resized_list.append(img.resize((112, 112)))
        resized_list[-1].save(dest_path+'/'+image_name+'.jpg')

И это должно реализовать то, что вы описываете.

edit: относительно того, что было задано в комментариях:

def resize_img(path,dest_path):

   name_list = []
   label_list = []
   resized_list = []
   folder_list = os.listdir(path)
   for num_imgs,folder in enumerate(folder_list):
       if not os.path.exists(dest_path+'/'+folder):
           os.makedir(dest_path+'/'+folder)
       print(str(num_imgs) + " : " + folder)
       files_path = path + "/" + folder
       image_list = os.listdir(files_path)
       name_list.append(folder)
       for image_name in image_list:
          image_path = path + "/" + folder + "/" + image_name
          print(image_path)
          img = Image.open(image_path)
          label_list.append(img)
          resized_list.append(img.resize((112, 112)))
          resized_list[-1].save(dest_path+'/'+folder+'/'+image_name+'.jpg'

Это должно реализовать то, что вы описывали. Вам необходимо вызывать os.mkdir () для каждой подпапки, которую вы хотите создать, поэтому она должна быть внутри первой для l oop.

...