2012-06-25 2 views
5

Я пытаюсь нарисовать простой квадрат RGBA размером 256x256 пикселей, используя png-модуль python.PyPNG, чтобы нарисовать простую заполненную ячейку

Я хотел бы использовать функцию png.Writer, и я предполагаю, что мне пришлось бы ее вытащить, используя метод write(). Однако мне не повезло! У меня нет веры в мой текущий код, поэтому я готов принять предложения с нуля.

Я предпочитаю не использовать PIL, если это возможно.

Любые предложения?

ответ

8

Я думаю, что формат, что может влиять на вас, кажется, что png имеет три формата ...

>>> help(png) 
    Boxed row flat pixel:: 

    list([R,G,B, R,G,B, R,G,B], 
     [R,G,B, R,G,B, R,G,B]) 

    Flat row flat pixel::  

     [R,G,B, R,G,B, R,G,B, 
     R,G,B, R,G,B, R,G,B] 

    Boxed row boxed pixel:: 

     list([ (R,G,B), (R,G,B), (R,G,B) ], 
      [ (R,G,B), (R,G,B), (R,G,B) ]) 

альфа, добавленный в конце каждой последовательности RGB.

write(self, outfile, rows) 
|  Write a PNG image to the output file. `rows` should be 
|  an iterable that yields each row in boxed row flat pixel format. 
|  The rows should be the rows of the original image, so there 
|  should be ``self.height`` rows of ``self.width * self.planes`` values. 
|  If `interlace` is specified (when creating the instance), then 
|  an interlaced PNG file will be written. Supply the rows in the 
|  normal image order; the interlacing is carried out internally. 

Примечание each row in boxed row flat pixel format.

Heres быстрый пример, который рисует белый квадрат.

>>> rows = [[255 for element in xrange(4) for number_of_pixles in xrange(256)] for number_of_rows in xrange(256)] 
>>> import numpy # Using numpy is much faster 
>>> rows = numpy.zeros((256, 256 * 4), dtype = 'int') 
>>> rows[:] = 255 
>>> png_writer = png.Writer(width = 256, height = 256, alpha = 'RGBA') 
>>> png_writer.write(open('white_panel.png', 'wb'), rows) 

отмечают, что Writer можно также использовать другие 2 форматы, которые, возможно, проще в использовании.

 | write_array(self, outfile, pixels) 
    |  Write an array in flat row flat pixel format as a PNG file on 
    |  the output file. See also :meth:`write` method. 
    | 
    | write_packed(self, outfile, rows) 
    |  Write PNG file to `outfile`. The pixel data comes from `rows` 
    |  which should be in boxed row packed format. Each row should be 
    |  a sequence of packed bytes. 

Попробуйте использовать numpy ее гораздо быстрее и проще при работе с матричными операциями, изображения могут быть представлены в виде матрицы.

удачи.

Если вы хотите печатать цвета, вам нужно будет рассчитать значения RGB для этого цвета, например, красный цвет (255, 0, 0, 255).

import png 
import numpy 
rows = numpy.zeros((256, 256, 4), dtype = 'int') # eassier format to deal with each individual pixel 
rows[:, :] = [255, 0, 0, 255] # Setting the color red for each pixel 
rows[10:40, 10:40] = [0, 255, 255, 255] # filled squared starting at (10,10) to (40,40) 
locs = numpy.indices(rows.shape[0:2]) 
rows[(locs[0] - 80)**2 + (locs[1] - 80)**2 <= 20**2] = [255, 255, 0, 255] # yellow filled circle, with center at (80, 80) and radius 20 
png_writer = png.Writer(width = 256, height = 256, alpha = 'RGBA') # create writer 
png_writer.write(open('colors_panel.png', 'wb'), rows.reshape(rows.shape[0], rows.shape[1]*rows.shape[2])) # we have to reshape or flatten the most inner arrays so write can properly understand the format 
+0

Это было очень полезно, и я лучше понимаю различия в формате. Тем не менее, я не могу заставить изображение печатать в цвете. Нужно ли мне сделать палитру для метода .Writer, как вы думаете. Я посоветовался с руководством, но он немного расплывчато. – Layla

+0

@Layla Я сделал обновления ... –

+0

@ Layla вам не нужно ничего делать, чтобы выписать цвет, но убедитесь, что вы правильно устанавливаете значения RGB для этого цвета. Я добавил несколько дополнительных примеров. –

 Смежные вопросы

  • Нет связанных вопросов^_^