Бесконечный цикл при изменении размеров изображений - PullRequest
0 голосов
/ 08 марта 2019

Я выполняю свой код, чтобы изменить размер всех изображений в каталоге, однако код выполняется по бесконечному циклу. Размеры изображений меняются так, как мне хочется, я просто не могу понять, как заставить его остановиться после одного прохода. Также я хотел бы указать, чтобы выходные данные имели тип файла .jpg.

import os, sys
from PIL import Image
import glob as glob

MY_DIRECTORY = "C:\\Users\\rzara\\Desktop\\sample_skulls"
for root, subdirs, files in os.walk(MY_DIRECTORY):
    for filename in files:
        for filename in glob.glob(MY_DIRECTORY+"/*.jpg"):
            size = 250, 250
            file_parts = os.path.splitext(filename)
            outfile = file_parts[0] + '_250x250' + file_parts[1]
            try:
                img = Image.open(filename)
                img = img.resize(size, Image.ANTIALIAS)
                img.save(outfile)
            except IOError as e:
                print("An exception occured '%s'" %e)

Я попытался изменить строку сохранения на:

img.save(outfile,'jpg')

но это дает и ошибку:

line 1983, in save 
save_handler = SAVE[format.upper()]
KeyError: 'JPG'

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Я вижу две проблемы.

Во-первых, вы звоните walk и glob и повторяете результаты обоих.Это означает, что если ваш каталог содержит пять файлов и все они соответствуют шаблону glob, вы будете повторять более пяти файлов пять раз в общей сложности двадцать пять раз.У вас должен быть только один for filename цикл.

Во-вторых, "jpg" не является поддерживаемым форматом файла PIL .Однако «JPEG» есть.Попробуйте это вместо этого.(Да, мне кажется странным, что img.save("result.jpg") понимает, что результатом должен быть jpeg, но img.save("result", "jpg") нет. Иногда библиотеки странные.)

Все вместе, результат может выглядеть следующим образом:

import os, sys
from PIL import Image
import glob as glob

MY_DIRECTORY = "C:\\Users\\rzara\\Desktop\\sample_skulls"
for filename in glob.glob(MY_DIRECTORY+"/*.jpg"):
    size = 250, 250
    file_parts = os.path.splitext(filename)
    outfile = file_parts[0] + '_250x250' + file_parts[1]
    img = Image.open(filename)
    img = img.resize(size, Image.ANTIALIAS)
    img.save(outfile, 'jpeg')
0 голосов
/ 08 марта 2019
for filename in files:
    for filename in glob.glob(MY_DIRECTORY+"/*.jpg"):

Вы извлекаете имя файла из files, но немедленно заменяете его на последовательность имен файлов из другого источника. Несмотря на то, что это не ipso facto бесконечный цикл, настоятельно рекомендуется иметь серьезную структурную ошибку.

0 голосов
/ 08 марта 2019

Не могли бы вы добавить следующие 3 строки в конец программы, чтобы найти другие ошибки, которые могут возникнуть при попытке?

    except Exception as message:
        print('general exception')
        print(message)
...