2015-06-19 11 views
5

aşağıdaki gibi bir prosedür kullanarak mevcut görüntü dosyasından piksel değerlerinin bir listesini oluşturabilir:Python'daki piksel değerleri listesinden nasıl bir PNG resim dosyası oluşturabilirim?

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

nasıl geri bir resim dosyasına piksel değerlerinin bu listeyi dönüştürmek olabilir ?

cevap

7

Önce, bir tek un-iç içe listede piksel dizilerini olması gerekir Hızlı çözüm:

pixels_out = [] 
for row in pixels: 
    for tup in row: 
     pixels_out.append(tup) 

Sonraki, giriş görüntüsünün özelliklerini kullanarak, yeni bir görüntü nesnesi yapmak ve içine veri koymak:

image_out = Image.new(image.mode,image.size) 
image_out.putdata(pixels_out) 

Son olarak, kaydedin:

image_out.save('test_out.png') 

Listeniz anlama listelerin bir listesini, dilimleme (i*width:(i+1)*width) tarafından üretilen ve bunların sonuncusu üretir

Temel mesele. Anlayışınız çok daha kolay olabilir: pixels = [pixel for pixel in pixels]. Açıkçası, bu aynı listeyi çıkarır, pixels, ancak piksel üzerinde bir işlem gerçekleştirmek için bu fikri kullanabilirsiniz. pixels = [operation(pixel) for pixel in pixels].

Gerçekten de aşırı düşünmüşsünüz. Görüntü boyutlarını yönetmek zorunda değilsiniz. Pikselleri bir listeye almak ve daha sonra putdata ile eşit boyutlu bir görüntüye koymak, PIL ile aynı şekilde doğrusallaştırıldıkları için sırayla tutar.

Kısacası

, bu orijinal pasajı olması gereken budur:

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

Sen kahire yapabilirsiniz. Çok kolay.

#!/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

Bu işlem düzgün bir fikirdir, ancak PIL'yi zaten kullanıyorsanız aşırı hız. – rjonnal

+1

OP, ne kullandığını belirtmedi. “Python'da bir piksel değerleri listesinden nasıl bir PNG resim dosyası oluşturabilirim?” Diye sordu. Bir cevap verdim. Belki de verileri daha sonra tekrar kullanmak ister mi? İzin verilmiyor mu, neyi? –

+1

Kahire kesinlikle izin verilir *. Veri yeniden kullanımı ile ne ilgisi olduğundan emin değilim. OP, PIL kullandığını belirtmiştir. – rjonnal

İlgili konular