Путаница между PIL.Image и PIL.Image.Image и правильный способ их использования?

1

Я пытаюсь сделать простые культуры изображений. Вот код

from PIL.Image import Image


def get_image_half(image, half="upper"):

    if half not in ["upper", "lower", "right", "left"]:
        raise Exception('Not a valid image half')

    img = Image.open(image)
    width, height = img.size

    if half == "upper":
        return img.crop(0, 0, width, height//2)
    elif half == "lower":
        return img.crop(0, height//2, width, height)
    elif half == "left":
        return img.crop(0, 0, width//2, height)
    else:
        return img.crop(width//2, 0, width, height)


def get_image_quadrant(image, quadrant=1):

    if not (1 <= quadrant <= 4):
        raise Exception("Not a valid quadrant")

    img = Image.open(image)
    width, height = img.size

    if quadrant == 2:
        return img.crop(0, 0, width//2, height//2)
    elif quadrant == 1:
        return img.crop(width//2, 0, width, height//2)
    elif quadrant == 3:
        return img.crop(0, height//2, width//2, height)
    else:
        return img.crop(width//2, height//2, width, height)

# test code for the functions


if __name__ == "__main__":

    import os

    dir_path = os.path.dirname(os.path.realpath(__file__))
    file = os.path.join(dir_path,"nsuman.jpeg")
    image = Image.open(file)

    for i in ["upper", "lower", "left", "right"]:
        get_image_half(image, i).show()

    for i in range(1,5):
        get_image_quadrant(image, quadrant=i)

Я получаю следующую ошибку.

image = Image.open(file)
AttributeError: type object 'Image' has no attribute 'open'

Быстрый googling привел меня к этой ссылке, и я изменил импорт на

import PIL.Image

и изменил код на

PIL.Image.open(image)

что дало еще одну ошибку

Traceback (most recent call last):
  File "quadrant.py", line 53, in <module>
    get_image_half(image, i).show()
  File "quadrant.py", line 10, in get_image_half
    img = Image.open(image)
  File "/usr/lib/python3/dist-packages/PIL/Image.py", line 2557, in open
    prefix = fp.read(16)
AttributeError: 'JpegImageFile' object has no attribute 'read'

Вопрос здесь в том, как разрешить эти ошибки и, что более важно, что такое PIL.Image и PIL.Image.Image и каков правильный способ их использования?

Теги:
image
python-imaging-library

1 ответ

2
Лучший ответ

PIL.Image должен открыть объект типа файла. После открытия у вас будет объект PIL.Image.Image:

from PIL import Image

image = Image.open('/foo/myfile.png')

open (fp, mode = 'r')

Открывает и идентифицирует данный файл изображения.

Это ленивая операция; эта функция идентифицирует файл, но файл остается открытым, и фактические данные изображения не считываются из файла, пока вы не попытаетесь обработать данные (или вызовите метод PIL.Image.Image.load). См. PIL.Image.new.

fp: имя файла (строка), объект pathlib.Path или файловый объект. Объект файла должен реализовывать методы file.read, file.seek и file.tell и быть открыт в двоичном режиме.

возвращает: объект PIL.Image.Image.

  • 0
    Да уж. Теперь я понимаю, и это исправило ошибки. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню