这实际上有效:
def tileshift(original, size, iterations):
im = Image.open(original)
format = im.format
x, y = [float(v) for v in im.size]
xr, yr = [float(v) for v in size]
r = max(xr / x, yr / y)
im = im.resize((int(round(x * r)), int(round(y * r))),
resample=Image.ANTIALIAS)
corners = _corners(im.size)
lu = im.crop(corners[0])
ru = im.crop(corners[1])
ll = im.crop(corners[2])
rl = im.crop(corners[3])
# debugging each tile
lu.save('tileshifted/lu.jpg')
ru.save('tileshifted/ru.jpg')
ll.save('tileshifted/ll.jpg')
rl.save('tileshifted/rl.jpg')
im.paste(lu, corners[1])
im.paste(ru, corners[3])
im.paste(ll, corners[0])
im.paste(rl, corners[2])
return (im, format)
def _corners(size):
w, h = size
return (
(0, 0, w / 2, h / 2),
(w / 2, 0, w, h / 2),
(0, h / 2, w / 2, h),
(w / 2, h / 2, w, h)
)
现在,这确实有效。我保存输出的图片并查看它。生成的图片是每个象限顺时针移动一格的图片。
为了让我的问题更清楚,我在这里上传了所有图片: http ://www.peterbe.com/stackoverflowquestion/index.html
但!当我停止每个角落的调试时。IE。我注释掉所有中间保存,所以它不是这样的:
...
# debugging each tile
#lu.save('tileshifted/lu.jpg')
#ru.save('tileshifted/ru.jpg')
#ll.save('tileshifted/ll.jpg')
#rl.save('tileshifted/rl.jpg')
...
现在它停止工作了!您会得到一张合成图片,其中左上角的图块似乎已重复了 3 次。
显然我不需要调试,但显然这些调用instance.save()
做了一些重要的事情。
更新
看来我可能已经找到了解决方案。如果在创建实例lu.load()
后立即运行,那么它可以工作!lu
从中获得灵感:https ://stackoverflow.com/a/3838495/205832