Как создать файл изображения PNG из списка значений пикселей в Python?

Я могу создать список значений пикселей из существующего файла изображения, используя следующую процедуру:

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

Как я могу преобразовать этот список значений пикселей обратно в файл изображения?

2 Solutions collect form web for “Как создать файл изображения PNG из списка значений пикселей в Python?”

Быстрая починка

Во-первых, вам нужно иметь свои кортежи пикселей в одном не-вложенном списке:

 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 сохраняется в порядке, поскольку они линеаризуются одинаково с помощью PIL.

Короче говоря, это должен был быть ваш оригинальный фрагмент:

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

Вы можете cairo. Довольно легко.

 #!/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 
 
Interesting Posts for Van-Lav

Как вставить содержимое одного списка в другой

tweepy (python): предел превышения превышен код 88

Почему Python не может выполнить java.exe через подпроцесс?

matplotlib пошаговая гистограмма прерывается при значении 10 ^ -1 на xubuntu

Завершение процесса выполняется с помощью `exec`, когда программа завершается

Как переменная класса доступа к статическому методу в Python?

Atlassian Bamboo с Django & Python – возможно?

Создайте простой пароль для пользователя unittest, используя PASSWORD_HASHERS

Лучший способ получить значения переменных из текстового файла – Python – Json

Создание Exe с модулем Selenium: Py2exe / Pyinstaller

Когда должен использоваться классификатор PyPI «Natural Language»?

Есть ли более питонический способ взрыва списка над аргументами функции?

Как определить, выполняется ли скрипт python из crontab?

IPython Notebook: как объединить вывод HTML и цифры matplotlib?

Как безопасно хранить пароль базы данных в Python?

Python - лучший язык программирования в мире.