这实际上是有效的:
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
但是!当我停止调试每个角落时。我把所有的中间保存都注释掉了,所以不是这样的:
...
# debugging each tile
#lu.save('tileshifted/lu.jpg')
#ru.save('tileshifted/ru.jpg')
#ll.save('tileshifted/ll.jpg')
#rl.save('tileshifted/rl.jpg')
...
现在它停止工作了!你会得到一张合成图,左上角的瓷砖已经重复了三次。你知道吗
显然,我不需要调试,但显然那些对instance.save()
的调用做了一些重要的事情。你知道吗
更新
看来我找到了解决办法。如果在创建lu
实例之后立即运行lu.load()
,那么它就可以工作了!
从中得到灵感:https://stackoverflow.com/a/3838495/205832
根据
crop
的文档:“这是一个延迟操作。对源图像的更改可能反映在裁剪图像中,也可能不反映在裁剪图像中。要获取单独的副本,请对裁剪的副本调用load方法。“因此,没有}迫使PIL复制作物。你知道吗
save
的每个角裁剪都是对原始图像的一部分的引用,而不是副本,因此您将LU粘贴到RU,然后尝试从RU粘贴到RL,但再次获得LU,依此类推。显然,{(另外,你实际上没有问任何问题。你的问题是含蓄的,但如果你真的千方百计地提出一个清晰而简洁的问题,那么你往往会意识到答案,或者意识到你需要提供更多的信息来引导你找到答案。)
相关问题 更多 >
编程相关推荐