Проблема обрезки и вставки PIL: кадрирование не создает обрезанное изображение - PullRequest
2 голосов
/ 01 октября 2010

Я пытаюсь обрезать изображение, а затем вставить обрезанное изображение в центр другого изображения.В идеале я хотел бы, чтобы обрезанное изображение было меньше, чем изображение, на которое оно вставлено, чтобы вокруг вставленного изображения была граница, но я не знаю, возможно ли это.

Вот что я попробовал (вместе с полученным сообщением об ошибке):

>>> import Image
>>> grey = Image.new('RGB', (200, 200), "grey")
>>> House = Image.open("House01.jpg")
>>> print grey.size, grey.mode, grey.format
>>>(200, 200) RGB None
>>> print House.size, House.mode, House.format
>>>(300, 300) RGB JPEG
>>> box = (25, 25, 25, 25)
>>> House.crop(box)
>>>Image._ImageCrop image mode=RGB size=0x0 at 0x11AD210>
>>> region = House.crop(box)
>>> region.show()
>>>Traceback (most recent call last):
 >>> File "<pyshell#28>", line 1, in <module>
    region.show()
>>>  File "C:\Python26\lib\site-packages\PIL\Image.py", line 1483, in show
    _show(self, title=title, command=command)
>>>  File "C:\Python26\lib\site-packages\PIL\Image.py", line 2123, in _show
    apply(_showxv, (image,), options)
>>>  File "C:\Python26\lib\site-packages\PIL\Image.py", line 2127, in _showxv
    apply(ImageShow.show, (image, title), options)
>>>  File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 41, in show
    if viewer.show(image, title=title, **options):
>>>  File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 66, in show
    self.show_image(image, **options)
>>>  File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 85, in show_image
    return self.show_file(self.save_image(image), **options)
>>>  File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 81, in save_image
    return image._dump(format=self.get_format(image))
>>>  File "C:\Python26\lib\site-packages\PIL\Image.py", line 493, in _dump
    self.save(file, format)
>>>  File "C:\Python26\lib\site-packages\PIL\Image.py", line 1439, in save
    save_handler(self, fp, filename)
>>>  File "C:\Python26\lib\site-packages\PIL\BmpImagePlugin.py", line 242, in _save
    ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, stride, -1))])
>>>  File "C:\Python26\lib\site-packages\PIL\ImageFile.py", line 498, in _save
    e.setimage(im.im, b)
>>>SystemError: tile cannot extend outside image

Я вижу, что размер 'region' был сделан (0,0), но я могуне понимаю, почему.

Любая помощь в этом была бы велика, спасибо

Ответы [ 2 ]

7 голосов
/ 01 октября 2010

Документация PIL для состояний метода обрезки:

Возвращает прямоугольную область из текущее изображение. Коробка из 4-х кортежей определяя левый, верхний, правый и координата нижнего пикселя.

Это ленивая операция. Изменения в исходное изображение может или не может быть отражено в обрезанном изображении. Получить отдельная копия, вызовите метод загрузки на обрезанной копии.

Итак, вы должны попробовать region = House.crop(box).load(), чтобы убедиться, что вы получили реальную обрезанную копию.

UPDATE:
На самом деле, кажется, что вышеперечисленное работает, только если вы используете PIL 1.1.6 и более поздние версии. В версиях до этого, я думаю, load() ничего не возвращает, поэтому вы не можете объединить операции. В этом случае используйте:

region = House.crop(box)
region.load()
0 голосов
/ 10 июня 2017

У меня была похожая ошибка, которую я, похоже, не мог решить, но потом понял, как и вы, что это связано с аргументами, переданными Image.crop (). Вы можете видеть размер вашего изображения (0,0), поэтому нечего показывать. Вы устанавливаете границы от точки (25,25) до (25,25).

Если вам нужно обрезанное изображение 25x25 (начиная с верхнего левого угла): `` ` >

>> import Image
>>> grey = Image.new('RGB', (200, 200), "grey")
>>> House = Image.open("House01.jpg")
>>> print grey.size, grey.mode, grey.format
>>>(200, 200) RGB None
>>> print House.size, House.mode, House.format
>>>(300, 300) RGB JPEG
>>> box = (0, 0, 25, 25)
>>> House.crop(box)
>>>Image._ImageCrop image mode=RGB size=0x0 at 0x11AD210>
>>> region = House.crop(box)
>>> region.show()

`` ` Если вы хотите начать с центра или другой точки, я бы использовал эту ссылку в качестве ссылки:

...