2010-11-18 10 views
4

私はPythonでPILとImageモードを使用しています。 私はこのコードでイメージを作成したい:イメージとpilモジュール用のPythonループ

imagesize = (12,12) 
image = Image.new("RGB",imagesize,color=None) 

私は私の画像上の画素を置くために、この機能を使用します。

.putpixel(xy, color) 

色はタプルのリストです。 exempleため:

色は一歩毎にインクリメントされる:

RGB = [((255, 255, 255),(207, 103, 36),(204, 93, 21),(204, 93, 21),(204, 93, 21), (.......some more RGB tuples.....)] 

Iは.putpixel(XY、色)にそのループを必要とします。たとえばRGB [0]、次のループRGB [1]など。 このループが行われている間、xとyは私にとっては難しくなります。 xが1から12(イメージサイズ)になり、yが0のときxがimageizeに達すると1から12に戻りますが、yは1になります。xと両方がイメージサイズの終わりに達するとループが終了します。

誰でも手伝ってもらえますか?私はPythonの新機能です。

よろしく、

Favolas

EDIT

P:S - これは学校のプロジェクトのためにあるので、私はimg.new以外の任意のメソッドを使用するカントと言うことは忘れ、img.showとimg.outpixel

+1

脇の下に、putpixelは通常非常に遅いです。おそらく、代わりにputdataを使用して、イメージデータを一度に設定したいと思うでしょう。 –

+0

これは自分で解決しようとしたようなものではありません。 – martineau

答えて

2

[OK]を上記の私のコメントは本当に答えに行っている必要があります。私は睡眠を取らなければならない。基本的に、ピクセルデータを一度に画像に入れることができます。 PIL.Imageのputdataメソッドは、画像のピクセルを構成するタプルのリストを受け入れます。だから、:

img = PIL.Image.new("RGB", (12, 12)) 
img.show() # see a black image 
pixels = [(255,0,0)]*(12*12) 
img.putdata(pixels) 
img.show() # see a red image 
+1

これは学校プロジェクトのためのもので、img.new、img.show、img.putpixelのような方法は使用できません:) – Favolas

1

どのようにRGB色を入れたいかによって異なります。例えば:

for y in range(12): 
    for x in range(12): 
    img.putpixel(x, y, RGB[(x + 12*y)%len(RBG)] 

はこれに0 + N、2N個の画素とに0 NのRGBSにN画素、0でN RBG色に0を置きます。両方のケースについて

import random 
... 
for y in range(12): 
    for x in range(12): 
    img.putpixel(x, y, RBG[random.randint(0, len(RGB)-1)] 

最適化が課題として残されている:ランダムに色を選択 - 別のオプションがあります。

+1

こんにちは。お返事ありがとうございます。しかし、それは私にこのエラーを与える:トレースバック(最新の最後の呼び出し):ファイル ""、行48、 ゼロ除算エラー:整数除算またはゼロでモジュロ – Favolas

+1

@ Favolasありがとう、固定。 '(x + 12 * y)%len(RGB)' – khachik

1

あなたは、私は、インデックスへのインクリメンタルあなたがX [私は11 * j個+]を取得する必要が1次元ベクトルに、0から11まで0から11とjに、ループを入れ子にしている場合。

>>> for i in range(5): 
... for j in range(5): 
...  print j + i*5 

は0

24に印刷されます画像を埋めるためのより良い方法のための他の回答を参照してください、そして、あまりにもこれを行うための、より神託の方法は、おそらくあります。しかし、これは一般的な答えです!

これは、1から始まらず、ゼロから始まる変数に注意してください。 12x12ピクセルの画像では、有効なxyの範囲は0から11です。

1

我々はこれら二つのリストを持っている場合:

xy = [(1,2),(3,4),(5,6),(7,8)] 
rgb = [(0,0,255), (0,255,0), (255,0,0), (255,255,0), (255,255,255)] 

私たちは辞書にRGBリストにXYリストをマッピングすることができます

d = dict(zip(xy,rgb)) 

次のようになります。

>>> print(d) 
{(1, 2): (0, 0, 255), (5, 6): (255, 0, 0), (3, 4): (0, 255, 0), (7, 8): (255, 255, 0)} 

これで辞書があり、キーはXYで、値は対応するRGBです。今、私たちはlist comprehensionを使用して、これらのキーと値のペアをマップすることができます。

[putpixel(x,col) for x,col in d.items()] 

テストとして、入力は結果を検証印刷しモックputpixel()メソッド:

def putpixel(xy,col): 
    print('%s set to %s' % (xy,col)) 

>>> result = [putpixel(x,col) for x,col in d.items()] 
(1, 2) set to (0, 0, 255) 
(5, 6) set to (255, 0, 0) 
(3, 4) set to (0, 255, 0) 
(7, 8) set to (255, 255, 0) 

一覧を理解は、通常、リストを返しますこの場合、putpixel()から結果を返さないので、結果リストには空白が含まれます。

関連する問題