奇特的海森伯与皮尔和裁剪和粘贴图片

2024-04-25 19:46:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这实际上是有效的:

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


Tags: cropformatsizesavedefru图片rl
1条回答
网友
1楼 · 发布于 2024-04-25 19:46:56

根据crop的文档:“这是一个延迟操作。对源图像的更改可能反映在裁剪图像中,也可能不反映在裁剪图像中。要获取单独的副本,请对裁剪的副本调用load方法。“

因此,没有save的每个角裁剪都是对原始图像的一部分的引用,而不是副本,因此您将LU粘贴到RU,然后尝试从RU粘贴到RL,但再次获得LU,依此类推。显然,{}迫使PIL复制作物。你知道吗

(另外,你实际上没有问任何问题。你的问题是含蓄的,但如果你真的千方百计地提出一个清晰而简洁的问题,那么你往往会意识到答案,或者意识到你需要提供更多的信息来引导你找到答案。)

相关问题 更多 >