函数的意思很简单,给定一个Image对象和一个delta参数,然后根据这个delta参数将Image对象割成左右两块提取出来,之后互换两块的位置。
大致看了一下程序之后,自己写了一个,然后对照范例,除了变量名不一样之外基本上是吻合的,但是运行之后的结果却很不容乐观。图像不是左右互换,而是仿佛还有第三块夹在中间,这就不是需要的效果了。
为了找出原因,又仔细查了一遍函数,之后加了两条显示被分割出来的图片的命令。再次运行的结果却一切正常了,但注释掉这两句显示命令之后,毛病又复现。
显然在同一幅图片里进行分割黏贴的操作,pil是存在问题的。所以新建了一个Image对象,用于返回反转之后的图片,问题也得到了顺利的解决。
至于为什么会出现这个错误的现象,暂时不是很清楚。
原图:
错误的图:
import Image
import ImageTk
def roll(im, delta):
"""Roll an image sideways"""
x, y = im.size
if delta % x == 0:
return image
im_l = im.crop((0, 0, delta, y))
im_r = im.crop((delta, 0, x, y))
# im_l.show()
# im_r.show()
imi = Image.new(im.mode, im.size)
imi.paste(im_r, (0, 0, x - delta, y))
imi.paste(im_l, (x - delta, 0, x, y))
return imi
try:
image = Image.open(r'd:\s\python\pil\tu\js.jpg')
im = roll(image, 250)
if im is not None:
im.save(r'd:\s\python\pil\tu\js_r.jpg')
except IOError:
print "Can not open file"