2015-06-19 3 views
5

मैं निम्नलिखित की तरह एक प्रक्रिया का उपयोग कर मौजूदा छवि फ़ाइल से पिक्सेल मूल्यों की एक सूची उत्पन्न कर सकते हैं:पायथन में पिक्सेल मानों की सूची से मैं पीएनजी छवि फ़ाइल कैसे बना सकता हूं?

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

मैं वापस एक छवि फ़ाइल के लिए पिक्सेल मूल्यों की इस सूची में कैसे परिवर्तित कर सकते हैं?

उत्तर

7

त्वरित सुधार

सबसे पहले, आप एक भी गैर-नेस्टेड सूची में अपने पिक्सेल tuples है की जरूरत है:

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

इसके बाद, एक नई छवि वस्तु, इनपुट छवि के गुणों का उपयोग कर, और इसे में डेटा डाल: अंत में

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

, सहेजें:

image_out.save('test_out.png') 

मौलिक मुद्दा

आपकी सूची समझ, बाद किया जा रहा है टुकड़ा करने की क्रिया (i*width:(i+1)*width) द्वारा उत्पन्न सूचियों की एक सूची उत्पन्न करता है। आपकी समझ बहुत आसान हो सकती है: pixels = [pixel for pixel in pixels]। जाहिर है यह एक ही सूची, pixels आउटपुट करता है, लेकिन आप पिक्सल पर एक ऑपरेशन करने के लिए विचार का उपयोग कर सकते हैं, उदा। pixels = [operation(pixel) for pixel in pixels]

वास्तव में, आपने इसे अधिक विचार किया। आपको छवि आयामों को प्रबंधित करने की आवश्यकता नहीं है। सूची में पिक्सल प्राप्त करना, और फिर उन्हें putdata के साथ एक बराबर आकार वाली छवि में डालना क्रम में रहता है क्योंकि उन्हें पीआईएल द्वारा उसी तरह रैखिक किया जाता है। आप आप काहिरा कर सकते हैं

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

:

संक्षेप में, यह है कि क्या अपने मूल टुकड़ा किया जाना चाहिए था है। बहुत आसान।

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

यह एक साफ विचार है, लेकिन अगर आप पहले से ही पीआईएल का उपयोग कर रहे हैं तो ओवरकिल। – rjonnal

+1

ओपी ने यह निर्दिष्ट नहीं किया कि वह क्या उपयोग कर रहा था। उन्होंने पूछा, "मैं पाइथन में पिक्सेल मानों की सूची से पीएनजी छवि फ़ाइल कैसे बना सकता हूं?" मैंने एक जवाब दिया। शायद, वह बाद में डेटा का पुन: उपयोग करना चाहता है? अनुमति नहीं है या क्या? –

+1

काहिरा निश्चित रूप से * अनुमति है *। मुझे यकीन नहीं है कि डेटा पुन: उपयोग के साथ क्या करना है। ओपी ने निर्दिष्ट किया कि वह पीआईएल का उपयोग कर रहा है। – rjonnal

संबंधित मुद्दे

 संबंधित मुद्दे