2

画像をトリミングして、トリミングした画像を別の画像の中央に貼り付けようとしています。理想的には、切り抜いた画像を貼り付ける画像よりも小さくして、貼り付けた画像の周りに境界線を付けたいのですが、それが可能かどうかはわかりません。

これが私が試したことです(結果のエラーメッセージとともに):

>>> 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

「領域」のサイズが (0,0) になっていることがわかりますが、その理由がわかりません。

これについての助けは素晴らしいでしょう

4

2 に答える 2

7

トリミング方法のPIL ドキュメントには次のように記載されています。

現在の画像から長方形の領域を返します。ボックスは、左、上、右、および下のピクセル座標を定義する 4 タプルです。

これは怠惰な操作です。ソース画像への変更は、トリミングされた画像に反映される場合と反映されない場合があります。別のコピーを取得するには、トリミングされたコピーで load メソッドを呼び出します。

そのregion = House.crop(box).load()ため、実際にトリミングされたコピーを取得するようにしてください。

更新:
実際には、上記は PIL 1.1.6 以降を使用している場合にのみ機能するようです。それ以前のバージョンでは、load()何も返さないので、操作を連鎖させることはできません。その場合は、次を使用します。

region = House.crop(box)
region.load()
于 2010-10-01T10:54:34.517 に答える