web-dev-qa-db-ja.com

Pillowを使用して画像を大きな画像に貼り付ける方法は?

私はかなりシンプルなコードファイルを持っています:

from PIL import Image
til = Image.new("RGB",(50,50))
im = Image.open("tile.png") #25x25
til.paste(im)
til.paste(im,(23,0))
til.paste(im,(0,23))
til.paste(im,(23,23))
til.save("testtiles.png")

ただし、実行しようとすると、次のエラーが表示されます。

Traceback (most recent call last):
    til.paste(im)
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 1340, in paste
    self.im.paste(im, box)
ValueError: images do not match

このエラーの原因は何ですか?それらは両方ともRGB画像であり、ドキュメントはこのエラーについて何も述べていません。

12
user1796160

問題は最初の貼り付けにあります-PILドキュメント( http://effbot.org/imagingbook/image.htm )によると、「ボックス」引数が渡されない場合、画像のサイズが一致する必要があります。

編集:私は実際にドキュメントを誤解しました、あなたは正しい、それはそこにありません。しかし、私がここで試したことから、2番目の引数を渡さないようで、サイズは一致しなければなりません。 2番目の画像のサイズを維持し、最初の画像の左上隅に配置する場合は、次のようにします。

...
til.paste(im,(0,0))
...
23
rayt

だから私は少し遅れるかもしれませんが、多分それは少し後に来る人々を助ける:

私が同じ問題を抱えていたとき、私はそれについて多くを見つけることができませんでした。そこで、ある画像を別の画像に貼り付けるスニペットを書きました。

def PasteImage(source, target, pos):

    # Usage:
    # tgtimg = PIL.Image.open('my_target_image.png')
    # srcimg = PIL.Image.open('my_source_image.jpg')
    # newimg = PasteImage(srcimg, tgtimg, (5, 5))
    # newimg.save('some_new_image.png')
    #

    smap = source.load()
    tmap = target.load()
    for i in range(pos[0], pos[0] + source.size[0]): # Width
        for j in range(pos[1], pos[1] + source.size[1]): # Height
            # For the paste position in the image the position from the top-left
            # corner is being used. Therefore 
            # range(pos[x] - pos[x], pos[x] + source.size[x] - pos[x])
            # = range(0, source.size[x]) can be used for navigating the source image.

            sx = i - pos[0]
            sy = j - pos[1]

            # Change color of the pixels
            tmap[i, j] = smap[sx, sy]

    return target

必ずしもO(N ^ 2)を必要とするため、必ずしも最適なアプローチではありませんが、小さな画像には有効です。誰かがコードを改善してより効率的にできるかもしれません。

急いで作ったので、入力検証もありません。ソース画像の幅と高さはターゲット画像の幅と高さ以下でなければならないことを知ってください。そうでないとクラッシュします。また、画像全体のみを貼り付けることができます。セクションまたは非矩形画像は貼り付けできません。

0
JH_WK