Python PIL: как сохранить обрезанное изображение? - PullRequest
5 голосов
/ 23 июня 2011

У меня есть скрипт, который создает изображение и обрезает его.Проблема в том, что после вызова метода crop () он не сохраняется на диске

crop = image.crop(x_offset, Y_offset, width, height).load()
return crop.save(image_path, format)

Ответы [ 3 ]

9 голосов
/ 23 июня 2011

Вам необходимо передать аргументы .crop() в кортеже.И не используйте .load()

box = (x_offset, Y_offset, width, height)
crop = image.crop(box)
return crop.save(image_path, format)

Это все что вам нужноХотя я не уверен, почему вы возвращаете результат операции сохранения;возвращается None.

1 голос
/ 23 июня 2011

Основная проблема заключается в попытке использовать объект, возвращаемый load(), в качестве объекта изображения. Из документации PIL:

В [PIL] 1.1.6 и более поздних версиях load возвращает объект доступа к пикселям, который можно использовать для чтения и изменения пикселей. Объект доступа ведет себя как двумерный массив [...]

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

crop = image.crop((x_offset, Y_offset, width, height))   # note the tuple
crop.load()    # OK but not needed!
return crop.save(image_path, format)
0 голосов
/ 10 апреля 2019

Вот полностью работающий aswer с НОВОЙ версией PIL 1.1.7. Координаты обрезки теперь левый верхний угол и правый нижний угол (НЕ x, y, ширина, высота).

Номер версии для Python: 2.7.15

и для PIL: 1,1,7

# -*- coding: utf-8 -*-

from PIL import Image
import PIL, sys

print sys.version, PIL.VERSION


for fn in ['im000001.png']:

    center_x    = 200
    center_y    = 500

    half_width       = 500
    half_height      = 100

    imageObject = Image.open(fn)

    #cropped = imageObject.crop((200, 100, 400, 300))


    cropped = imageObject.crop((center_x - half_width,
                                center_y - half_height, 
                                center_x + half_width,
                                center_y + half_height,
                                ))

    cropped.save('crop_' + fn, 'PNG')
...