【问题标题】:Pasting an image on another image将图像粘贴到另一个图像上
【发布时间】:2019-09-17 04:04:01
【问题描述】:

我正在尝试将 4 张尺寸为:422x223 的图像粘贴到 844x446 的图像中。 我看到img.paste 有两个参数:图像和框。

这是我尝试过的:

from PIL import Image
with Image.open(r"ALLPARTS.png") as end:
    with Image.open(r"TOPLEFT.png") as img:
        end.paste(img,(0,0))
    with Image.open(r"BOTTOMLEFT.png") as img:
        end.paste(img,(0,223,422,0))
    with Image.open(r"BOTTOMRIGHT.png") as img:
        end.paste(img,(422,223,0,0))
    with Image.open(r"TOPRIGHT.png") as img:
        end.paste(img,(422,0,0,223))
    end.save(r"ALLPARTS.png")

对于TOPLEFT.png,它确实有效,但不适用于其余部分。 我收到错误消息:

self.im.paste(im, box)

ValueError: images do not match

我不明白为什么。我以为我了解“盒子”的工作原理,但显然我没有。 那么你能解释一下它是如何工作的吗?

【问题讨论】:

    标签: python python-3.x image python-imaging-library


    【解决方案1】:

    那个框是 (x0, y0, x1, y1),其中点 0 是左上角,点 1 是下角:

    from PIL import Image
    with Image.open(r"ALLPARTS.png") as end:
        with Image.open(r"TOPLEFT.png") as img:
            end.paste(img,(0,0))
        with Image.open(r"BOTTOMLEFT.png") as img:
            end.paste(img,(0,223,422,446))
        with Image.open(r"BOTTOMRIGHT.png") as img:
            end.paste(img,(422,223,844,446))
        with Image.open(r"TOPRIGHT.png") as img:
            end.paste(img,(422,0,422,223))
        end.save(r"ALLPARTS.png")
    

    或者使用提供的二元组(只是左上角点):

    from PIL import Image
    with Image.open(r"ALLPARTS.png") as end:
        with Image.open(r"TOPLEFT.png") as img:
            end.paste(img,(0,0))
        with Image.open(r"BOTTOMLEFT.png") as img:
            end.paste(img,(0,223))
        with Image.open(r"BOTTOMRIGHT.png") as img:
            end.paste(img,(422,223))
        with Image.open(r"TOPRIGHT.png") as img:
            end.paste(img,(422,0))
        end.save(r"ALLPARTS.png")
    

    【讨论】:

    • 它仍然显示错误,知道为什么吗?编辑:其中一个图像的大小与其他图像的大小不同,这可能是导致错误的原因。
    • 我仍然收到最后一个错误,而且它的大小合适。
    • 真的不知道,试试只提供左上角的编辑答案。
    【解决方案2】:

    您作为框传递的 4 元组应与要粘贴的图像的大小相匹配,并采用 (left, top, right, bottom) 的形式。

    因此我认为您使用的坐标是错误的。

    或者,您可以只传递一个 2 元组,给出左上角坐标,就像您在第一个示例中所做的那样。

    【讨论】:

    • 如果图像的大小是 422x223,那么我可以通过的 max(left,top,right,bottom) 是多少?
    • 最大尺寸是一个不超出底部图像边界的盒子。例如,最大值将是原始图像的大小:`(0, 223, 422, 0)
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2020-01-16
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多