2012-02-21 11 views
2

image.load()を使用して操作したデータからイメージファイルを保存するにはどうすればよいですか?PILを使用して、.load()を使用した後に画像を操作しないで保存するにはどうすればよいですか?

これは私が私はしかし、このエラーを取得し、それを実行すると、同じサイズ

from PIL import Image 
import random 

image1 = Image.open("me.jpg") 
image2 = Image.open("otherme.jpg") 

im1 = image1.load() 
im2 = image2.load() 

width, height = image1.size 

newimage = Image.new("RGB",image1.size) 
newim = newimage.load() 

xx = 0 
yy = 0 

while xx < width: 
    while yy < height: 
     if random.randint(0,1) == 1: 
      newim[xx,yy] = im1[xx,yy] 
     else: 
      newim[xx,yy] = im2[xx,yy] 
     yy = yy+1 
    xx = xx+1 

newimage.putdata(newim) 
newimage.save("new.jpg") 

の二つの絵をマージするために使用私のコードです。

Traceback (most recent call last): 
File "/home/dave/Desktop/face/squares.py", line 27, in <module> 
newimage.putdata(newim) 
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1215, in putdata 
self.im.putdata(data, scale, offset) 
TypeError: argument must be a sequence 

ディクショナリが.load()シーケンスを使用していないのですか?私はこの問題を持つGoogleの誰かを見つけることができません。

答えて

1

loadによって返さdictionaryは(実際辞書されていない)画像データです。 putdataでリロードする必要はありません。その行を削除するだけです。

また、代わりにwhileループのforループを使用します。

for xx in range(0, width): 
    for yy in range(0, height): 
     if random.randint(0,1) == 1: 
      newim[xx,yy] = im1[xx,yy] 
     else: 
      newim[xx,yy] = im2[xx,yy] 

は今xxyyを初期化し、インクリメントする必要はありません。

あなたもitertools.productを使用することができます。

for xx, yy in itertools.product(range(0, width), range(0, height)): 
    if random.randint(0,1) == 1: 
     newim[xx,yy] = im1[xx,yy] 
    else: 
     newim[xx,yy] = im2[xx,yy] 
関連する問題