2015-06-19 3 views
5

kann ich eine Liste von Pixelwerten aus einer vorhandenen Bilddatei unter Verwendung eines Verfahrens wie folgt erzeugen:Wie kann ich eine PNG-Bilddatei aus einer Liste von Pixelwerten in Python erstellen?

from PIL import Image 
image = Image.open("test.png") 
pixels = list(image.getdata()) 
width, height = image.size 
pixels = [pixels[i * width:(i + 1) * width] for i in xrange(height)] 

Wie könnte ich diese Liste von Pixelwerten zurück in eine Bilddatei konvertieren?

Antwort

7

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') 
0

Sie können Sie kairo. Ziemlich einfach.

#!/usr/bin/python 

# Extracting pixels from an image ------ 
from PIL import Image 
image = Image.open("test.png") 
pixels = list(image.getdata()) 
width, height = image.size 
pixels = [pixels[i * width:(i + 1) * width] for i in xrange(height)] 


# Putting pixels back to an image ------ 

import cairo 

Width=len(pixels[0]) 
Height=len(pixels) 

surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, Width, Height) 
context = cairo.Context (surface) 

y=0 
for row in pixels: 
    x=0 
    for rgb in row: 
     r=rgb[0] /255.0 
     g=rgb[1] /255.0 
     b=rgb[2] /255.0 
     context.set_source_rgb(r, g, b) 
     context.rectangle(x, y, 1, 1) 
     context.fill() 
     x+=1 
    y+=1 

surface.write_to_png ("out.png") # Output to PNG 
+1

Dies ist eine nette Idee, aber Overkill, wenn Sie bereits PIL verwenden. – rjonnal

+1

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? –

+1

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

Verwandte Themen