Quick Fix
Zuerst müssen Sie Ihre Pixel Tupeln in einer einzigen nicht-verschachtelte Liste haben:
pixels_out = []
for row in pixels:
for tup in row:
pixels_out.append(tup)
Als nächstes stellen ein neues Bildobjekt, Eigenschaften des Eingangsbildes verwendet wird, und setzen die Daten hinein:
image_out = Image.new(image.mode,image.size)
image_out.putdata(pixels_out)
Schließlich speichern:
image_out.save('test_out.png')
Grund Ausgabe
Ihre Liste Verständnis eine Liste von Listen erzeugt, wobei die letztere durch das Aufschneiden erzeugt (i*width:(i+1)*width
). Ihr Verständnis kann viel einfacher sein: pixels = [pixel for pixel in pixels]
. Offensichtlich gibt dies dieselbe Liste aus, pixels
, aber Sie können die Idee verwenden, eine Operation an den Pixeln durchzuführen, z. pixels = [operation(pixel) for pixel in pixels]
.
Wirklich, Sie übertrieben es. Sie müssen die Bilddimensionen nicht verwalten. Das Abrufen der Pixel in einer Liste und das anschließende Einfügen in ein Bild gleicher Größe mit putdata
behält die Reihenfolge bei, da sie von PIL auf die gleiche Weise linearisiert werden. Kurz
In, ist das, was Ihre ursprüngliche Schnipsel sein sollte:
from PIL import Image
image = Image.open("test.png")
image_out = Image.new(image.mode,image.size)
pixels = list(image.getdata())
image_out.putdata(pixels)
image_out.save('test_out.png')
Dies ist eine nette Idee, aber Overkill, wenn Sie bereits PIL verwenden. – rjonnal
Das OP gab nicht an, was er verwendete. Er fragte: "Wie kann ich eine PNG-Bilddatei aus einer Liste von Pixelwerten in Python erstellen?" Ich gab eine Antwort. Vielleicht möchte er die Daten später wiederverwenden? Nicht erlaubt oder was? –
Kairo ist sicherlich * erlaubt *. Ich bin mir nicht sicher, was es mit der Datenwiederverwendung zu tun hat. Der OP hat angegeben, dass er PIL benutzt. – rjonnal