我正在尝试裁剪图像,然后将裁剪后的图像粘贴到另一个图像的中心。理想情况下,我希望裁切后的图像小于粘贴的图像,以便在粘贴的图像周围有一个边框,但我不知道这样是否可行。
这是我尝试过的方法(以及由此产生的错误消息):
>>> 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),但我不明白为什么。
任何对此的帮助将非常感谢
裁剪方法的PIL文档指出:
返回当前图像的矩形区域。该框是一个四元组,定义了左,上,右和下像素坐标。 这是一个懒惰的操作。对源图像的更改可能会也可能不会反映在裁剪后的图像中。要获取单独的副本,请在裁剪后的副本上调用load方法。
返回当前图像的矩形区域。该框是一个四元组,定义了左,上,右和下像素坐标。
这是一个懒惰的操作。对源图像的更改可能会也可能不会反映在裁剪后的图像中。要获取单独的副本,请在裁剪后的副本上调用load方法。
因此,您应该尝试 region = House.crop(box).load() 确保获得实际的裁剪副本。
region = House.crop(box).load()
更新: 实际上,似乎只有在使用PIL 1.1.6及更高版本时,以上方法才有效。在此之前的版本中,我猜load()不会返回任何内容,因此您无法链接操作。在这种情况下,请使用:
load()
region = House.crop(box) region.load()