我最近开始玩Pillow。我正在比较Python 3.3中的两张图片,并希望将差异保存为图像。
from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw
file1 = '300.jpg'
file2 = '300.jpg'
im1 = Image.open(file1)
im2 = Image.open(file2)
diff = ImageChops.difference(im1, im2).getbbox()
draw = ImageDraw.Draw(im2)
draw.rectangle(diff)
im2.convert('RGB').save('file3.jpg')
但我总是得到 TypeError:参数必须是序列
我相信这发生在 draw.rectangle(diff) 我该如何摆脱错误?
谢谢。
答案 0 :(得分:1)
来自PIL documentation:
PIL.ImageDraw.Draw.rectangle(xy, fill=None, outline=None)
画一个矩形。参数:
xy - 定义边界框的四个点。
[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
的顺序。第二点就在绘制的矩形之外。outline - 用于轮廓的颜色。
fill - 用于填充的颜色。
这意味着您应该传递一个序列,也可以传递documentation:
Image.getbbox()
计算图像中非零区域的边界框。
返回:边界框作为定义左边的4元组返回, 上,右和下像素坐标。如果图像完全 为空,此方法返回None。
所以问题是你将一个4元组传递给一个期望序列为[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
你可以使用list()
文字包装你的4元组,以获得函数所期望的第二个选项:
from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw
file1 = '300.jpg'
file2 = '300.jpg'
im1 = Image.open(file1)
im2 = Image.open(file2)
diff = ImageChops.difference(im1, im2).getbbox()
draw = ImageDraw.Draw(im2)
diff_list = list(diff) if diff else []
draw.rectangle(diff_list)
im2.convert('RGB').save('file3.jpg')
或者,如果要将输入替换为第一种类型rectangle
,则可以执行以下操作:
from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw
file1 = '300.jpg'
file2 = '300.jpg'
im1 = Image.open(file1)
im2 = Image.open(file2)
diff = ImageChops.difference(im1, im2).getbbox()
draw = ImageDraw.Draw(im2)
diff_list_tuples = >>> [diff[0:2], diff[2:]] if diff else [(None, None), (None, None)]
draw.rectangle(diff_list)
im2.convert('RGB').save('file3.jpg')