2010-11-18 15 views
4

Ich benutze PIL und Bild-Modi in Python. Ich mag ein Bild mit diesem Code erstellen:Python Schleife für Bild und pil Modul

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

Ich werde diese Funktion nutzen zu Pixeln auf meinem Bild zu setzen:

.putpixel(xy, color) 

Farbe ist in einer Liste von Tupeln. Für exemple:

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

muss ich eine Schleife, die in .putpixel (xy, Farbe):

Farbe jedes Mal einen Schritt inkrementiert wird. Zum Beispiel RGB [0], nächste Schleife RGB [1] und so weiter. Während diese Schleife gemacht wird, ist das x und y um so schwieriger für mich. x geht von 1 bis 12 (Bildgröße), während y 0 ist. Wenn x die Bildgröße erreicht, kehrt es zu 1 zu 12 zurück, aber y ist jetzt 1. Die Schleife endet, wenn x und beide das Ende der Bildgröße erreichen.

Kann mir jemand helfen? Ich bin neu in Python.

Grüße,

Favolas

EDIT

P: S - vergessen zu sagen, dass da dies für ein Schulprojekt, das ich neben img.new alle Methoden verwenden kann nicht, img.show und img.outpixel

+1

Auf einer Nebenbemerkung ist Putpixel normalerweise sehr langsam. Wahrscheinlich möchten Sie stattdessen putdata verwenden und die Bilddaten auf einmal einstellen. –

+0

Es sieht nicht so aus, als hättest du _an_ versucht, das selbst zu lösen ... – martineau

Antwort

2

Ok, mein Kommentar von oben sollte wirklich in eine Antwort gegangen sein. Ich sollte etwas schlafen. Sie können im Grunde nur Ihre Pixeldaten auf einmal in das Bild einfügen. Die putdata-Methode eines PIL.Image akzeptiert eine Liste von Tupeln, aus denen die Pixel der Bilder bestehen. Also:

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

Dies ist für ein Schulprojekt und ich kann keine Methoden neben img.new, img.show und img.putpixel :) – Favolas

1

Es hängt davon ab, wie Sie RGB-Farben setzen möchten. Zum Beispiel:

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

werden in 0 bis N Pixel, 0 bis N RGBs auf 0 + N, 2N Pixel und so weiter 0 bis N RBG Farben setzen. Es gibt andere Optionen - wählen Sie die Farbe nach dem Zufall:

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

Optimierung für beide Fälle wird als Übung.

+1

Hallo. Danke für deine Antwort. Aber es gibt mir diesen Fehler: Traceback (letzten Anruf zuletzt): Datei "", Zeile 48, in ZeroDivisionError: Ganzzahl Division oder Modulo durch Null – Favolas

+1

@ Favolas danke, behoben. '(x + 12 * y)% len (RGB)' – khachik

1

Wenn Sie verschachtelte Schleifen, i von 0 bis 11 und j von 0 bis 11, dann zu indizieren schrittweise in einen eindimensionalen Vektor müssen Sie X erhalten [j + i * 11].

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

werden 0 bis 24.

Andere Antworten nach besseren Möglichkeiten, Druckbilder zu füllen, und es gibt wahrscheinlich mehr pythonic Möglichkeiten, dies zu tun. Aber das ist die generische Antwort!

Beachten Sie, dass dies für Variablen gilt, die bei NULL beginnen, nicht EINS. Für Ihr 12x12 Pixel Bild ist der gültige xy Bereich von 0 bis 11.

1

Wenn wir diese beiden Listen:

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)] 

Wir können die XY-Liste in die RGB-Liste in einem Wörterbuch Karte:

d = dict(zip(xy,rgb)) 

die wie folgt aussieht:

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

Also haben wir jetzt ein Wörterbuch, der Schlüssel ist der XY und der Wert ist der entsprechende RGB. Jetzt können wir diese Schlüssel-Wert-Paare mit list comprehension Karte:

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

Als Test ein Mock putpixel() -Methode, die die Eingaben überprüfen Sie die Ergebnisse druckt:

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) 

Liste Verständnis in der Regel gibt eine Liste von verarbeiteten Artikeln, in diesem Fall geben wir kein Ergebnis von putpixel() zurück, daher enthält unsere Ergebnisliste Leergut.

Verwandte Themen