-1

Python と PIL を使用して 2 つの画像を操作しています。getpixel と putpixel を使用して、ある画像を別の画像に配置することに成功しました。pil が提供するコピー/貼り付け機能を使用することは許可されていません (したがって、getpixel および putpixel)。ここで、基本的に最初の画像 (テンプレート画像としましょう) を、目的の画像のユーザー定義の場所に配置しようとしています。ユーザー入力を受け入れる方法は知っていますが、テンプレート画像をユーザーの座標に表示するためにこれらの変数を配置する場所がわかりません。基本的に、これらの座標をテンプレート イメージの新しい原点にしたいと考えています。座標を putpixel x および y として使用しようとしましたが、それは、ユーザーの座標でピクセルを互いに積み重ねているだけだと思います。私が見逃しているのは単純なものだと確信しています。どんな助けでも大歓迎です。

from PIL import Image
import sys

print "Image Manipulation\n"

tempImg = Image.open("template.png")
destImg = Image.open("destination.jpg")

tempWidth,tempHeight = tempImg.size
destWidth,destHeight = destImg.size

if tempWidth >= destWidth and tempHeight >= destHeight:
    print "Error! The template image is larger than the destination image."
    sys.exit()
else:
    print "The template image width and height: ",tempWidth,tempHeight
    print "The destination image width and height: ",destWidth,destHeight

x_loc = raw_input("Enter the X coordinate: ")
y_loc = raw_input("Enter the Y coordinate: ")

x_loc = int(x_loc) # <--where do I put these?
y_loc = int(y_loc)

tempImg = tempImg.convert("RGBA")
destImg = destImg.convert("RGBA")
img = tempImg.load()

for x in xrange(tempWidth):
    for y in xrange(tempHeight):
        if img[x,y][1] > img[x,y][0] + img[x,y][2]:
            img[x,y] = (255,255,255,0)
        else:
            destImg.putpixel((x,y),tempImg.getpixel((x,y)))


destImg.show()
4

1 に答える 1

0

私はそれを考え出した!変数をいろいろいじった後、変数を追加する場所を見つけました。getpixel 関数の x,y 座標としてそれらを使用しようとし続けましたが、これらの変数はループ内で更新されていないため、基本的にそれらを互いに積み重ねるだけであることがわかっていました。

getpixel((x_loc,y_loc),...) #<--wrong

次に、クリックしました。ユーザーの座標を getpixel の x と y に追加する必要がありました。例えば:

getpixel((x+x_loc,y+y_loc),...) #<--Eureka!!

これは基本的に、テンプレート画像の原点をユーザーの入力場所に設定します。これをはるかに高速に行う方法が他にもあることは知っていますが、getpixel、putpixel、および画像を開く/保存のみを使用するように指示されました。もちろん、ここでは画像を保存するのではなく、表示しているだけです。お気軽にお試しください。

print "Image Manipulation\n"
template = raw_input("Enter the template image: ")
destination = raw_input("Enter the destination image: ")

tempImg = Image.open(template)
destImg = Image.open(destination)

tempWidth,tempHeight = tempImg.size
destWidth,destHeight = destImg.size

if tempWidth >= destWidth and tempHeight >= destHeight:
    print "Error! The template image is larger than the destination image."
    sys.exit()
else:
    print "The template image width and height: ",tempWidth,tempHeight
    print "The destination image width and height: ",destWidth,destHeight

x_loc = raw_input("Enter the X coordinate: ")
y_loc = raw_input("Enter the Y coordinate: ")

x_loc = int(x_loc)
y_loc = int(y_loc)

tempImg = tempImg.convert("RGBA")
destImg = destImg.convert("RGBA")
img = tempImg.load()

for x in range(tempWidth):
    for y in range(tempHeight):
        if img[x,y][1] > img[x,y][0] + img[x,y][2]: #<-- removes green border from image
            img[x,y] = (255,255,255,0)
        else:
            destImg.putpixel((x+x_loc,y+y_loc),tempImg.getpixel((x,y)))


destImg.show()

**注: プログラムのこの部分はオプションです。

if img[x,y][1] > img[x,y][0] + img[x,y][2]:
        img[x,y] = (255,255,255,0)

与えられたテンプレート画像には緑色の境界線があり、目的の画像に配置するときにそれを削除するように求められました.

于 2013-09-12T13:58:11.957 に答える