Как изменить размер изображения с помощью PIL в папке в Python - PullRequest
0 голосов
/ 24 мая 2019

Я использую PIL / Python для изменения размера изображений в папке. После изменения размера изображений я хочу снова сохранить их в той же папке с тем же именем, но у меня возникает ошибка Не удается записать режим RGBA как JPEG

В папке есть несколько форматов изображений

это код, который используется для изменения размера изображений

path = "data/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, 'JPEG', quality=90)

resize()

это ошибка, которую я имею

cannot write mode RGBA as JPEG

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Для изменения размера изображений я всегда использовал .thumbnail.Это простой в использовании, и это просто работает.Чтобы сохранить данные цветов и альфа, решение, предоставленное Vasu Deo.S , работает хорошо, и это то, что я использую в своем сценарии.

Вам необходимо сохранить ваши изображенияв .png вместо .jpeg, чтобы избежать ошибки альфа-канала.

Итак, вот ваш отредактированный код, который действительно работает.

path = "data/images/"
dirs = os.listdir( path )

def resizeImages():
    for item in dirs:
        if os.path.isfile(path+item):
            im = Image.open(path+item)
            im = im.convert('RGBA')

            size = 200, 200

            imResize.thumbnail(size)

            f, e = os.path.splitext(path+item)
            imResize.save(f+'.png')

Обратите внимание, что это нужно будетсохранено как .png.Если вы хотите сохранить как .jpeg изображение, вы должны избавиться от альфа-канала, используя это:

path = "data/images/"
dirs = os.listdir( path )

def resizeImages():
    for item in dirs:
        if os.path.isfile(path+item):
            im = Image.open(path+item)
            im = im.convert('RGBA')

            data = np.array(im)
            red, green, blue, alpha = data.T

            alpha_areas = (red == 0) & (blue == 0) & (green == 0) & (alpha == 0) # set alpha to 0
            data[..., :-1][alpha_areas.T] = (255,255,255)
            im = Image.fromarray(data)

            size = 200, 200

            imResize = im.thumbnail(size)

            f, e = os.path.splitext(path+item)
            imResize.save(f+'.png')
0 голосов
/ 24 мая 2019

Попробуйте: -

f = "apple.png"
im = Image.open(path+item)
im = im.convert("RGB") 
imResize = im.resize((200,200), Image.ANTIALIAS)
imResize.save(f, quality=90)

Мы удалили альфа-канал с изображения и преобразовали цветовое пространство только в RGB. Поскольку большинство форматов файлов поддерживают изображение с цветовым пространством RGB, я не думаю, что ошибки по-прежнему будут существовать.

Не определяйте явно формат вывода всех входных изображений как .jpeg, скорее позвольте PIL определить его, посмотрев на расширение файла.

P.S .: - Не используйте этот метод, если учитывается прозрачность изображения (альфа-канал), поскольку этот метод избавит от альфа-канала изображения.

...