我正在尝试裁剪图像,然后将裁剪后的图像粘贴到另一个图像的中心。理想情况下,我希望裁剪的图像比粘贴的图像小,以便在粘贴的图像周围有边框,但我不知道是否可能。
这是我尝试过的(以及产生的错误消息):
>>> 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),但我不明白为什么。
对此有任何帮助都非常感谢
答案 0 :(得分:7)
裁剪方法的PIL documentation说明:
从中返回一个矩形区域 目前的形象。这个盒子是一个4元组 定义左,上,右和 较低的像素坐标。
这是一个懒惰的操作。改变为 源图像可能是也可能不是 反映在裁剪的图像中。要得到 单独的副本,调用load方法 在裁剪的副本上。
因此,您应该尝试 以确保获得实际的裁剪副本。region = House.crop(box).load()
<强>更新强>
实际上,如果您使用的是PIL 1.1.6及更高版本,上述内容似乎只能起作用。在之前的版本中,我猜load()
不会返回任何内容,因此您无法链接操作。在这种情况下,请使用:
region = House.crop(box)
region.load()
答案 1 :(得分:0)
我有一个类似的错误,我似乎无法解决,但后来我意识到它与传递给Image.crop()的参数有关。您可以看到图像的大小为(0,0),因此无需显示任何内容。您正在设置从点(25,25)到(25,25)的边界。
如果您需要25x25裁剪图像(从左上角开始): ``` &GT;
>> 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()
``` 如果您想从中心或其他点开始,我会使用此link作为参考: