当前位置: 首页 > 面试题库 >

PIL裁剪和粘贴问题:裁剪不会创建裁剪的图像

陆飞龙
2023-03-14
问题内容

我正在尝试裁剪图像,然后将裁剪后的图像粘贴到另一个图像的中心。理想情况下,我希望裁切后的图像小于粘贴的图像,以便在粘贴的图像周围有一个边框,但我不知道这样是否可行。

这是我尝试过的方法(以及由此产生的错误消息):

>>> 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方法。

因此,您应该尝试 region = House.crop(box).load() 确保获得实际的裁剪副本。

更新:
实际上,似乎只有在使用PIL
1.1.6及更高版本时,以上方法才有效。在此之前的版本中,我猜load()不会返回任何内容,因此您无法链接操作。在这种情况下,请使用:

region = House.crop(box)
region.load()


 类似资料:
  • 我试图在从图库中选择图像后使用intent来裁剪图像。以下是我的代码片段 在这里,我使用PICK_IMAGE_REQUEST意图句柄调用上面的代码段 由于我在裁剪后使用了相同的意图,即PICK_IMAGE_REQUEST,可能会出现什么问题

  • 本文向大家介绍iOS实现裁剪框和图片剪裁功能,包括了iOS实现裁剪框和图片剪裁功能的使用技巧和注意事项,需要的朋友参考一下 图片处理中经常用的图片剪裁,就是通过剪裁框确定图片剪裁的区域,然后剪去该区域的图片,今天实现了一下,其实图片剪裁本身不难,主要剪裁框封装发了点时间,主要功能可以拖动四个角缩放,但不能超出父视图,拖动四个边单方向缩放,不能超出父视图,拖动中间部分单单移动,不改变大小,不能超出父

  • 我将<code>背景 1.back_xml: 2.瓷砖.xml 现在,我将back.xml设置为< code >背景以< code>LinearLayout工作正常。 我需要有一个圆角,以及它的边框。但是我只有圆角的边框,而不是图像,我的代码中有什么问题吗? 这是我的照片:

  • 本节,我们将裁剪图像的一部分,然后把其结果绘制到画布上。 图3-2 裁剪图像 绘制步骤 按照以下步骤,裁剪图像的一部分,再把结果绘制到画布: 1. 定义画布上下文: window.onload  = function(){ var canvas  = document.getElementById("myCanvas"); var context  = canvas.getContext

  • 裁剪区域clip() 使用Canvas绘制图像的时候,我们经常会想要只保留图像的一部分,这是我们可以使用canvas API再带的图像裁剪功能来实现这一想法。 Canvas API的图像裁剪功能是指,在画布内使用路径,只绘制该路径内所包含区域的图像,不绘制路径外的图像。这有点像Flash中的图层遮罩。 使用图形上下文的不带参数的clip()方法来实现Canvas的图像裁剪功能。该方法使用路径来对C

  • 裁剪节点 成员变量 变量 类型 名称 备注 clipRegion number 裁剪区域 无 enableClip boolean 是否开启裁剪 默认true 方法 构造函数 new BK.ClipRectNode(x,y,w,h) 参数 类型 名称 备注 x number 裁剪区域x坐标 y number 裁剪区域y坐标 width number 裁剪区域宽 height number 裁剪区域