2012-06-25 14 views
5

Estoy tratando de dibujar un cuadrado simple RGBA de 256x256 píxeles utilizando el módulo png de python.PyPNG para dibujar un cuadro lleno simple

Me gustaría usar la función png.Writer y me imagino que tendré que dibujar usando el método write(). ¡No he tenido suerte, sin embargo! No tengo fe en mi código actual, así que estoy dispuesto a tomar sugerencias desde cero

Prefiero no usar el PIL si es posible.

¿Alguna sugerencia?

Respuesta

8

creo que el formato es lo que puede estar afectando a usted, parece que png tiene tres formatos ...

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

El alfa que se adjunta al final de cada secuencia de 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. 

nota del each row in boxed row flat pixel format.

aquí hay un ejemplo rápido que dibuja un cuadrado blanco.

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

nota que Writer También puede utilizar los otros 2 formatos, que tal vez más fácil de usar.

 | 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. 

Intente utilizar numpy sus matrices mucho más rápido y más fácil cuando se trata de operaciones de la matriz, las imágenes se pueden representar como.

buena suerte.

Si desea imprimir colores, deberá calcular los valores RGB para ese color, por ejemplo, el color rojo es (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

Esto fue extremadamente útil y entiendo mejor las diferencias de formato. Sin embargo, parece que no puedo obtener la imagen para imprimir en color. ¿Necesito hacer una paleta para el método .Writer, crees? Consulté el manual, pero es un poco vago. – Layla

+0

@Layla He hecho actualizaciones ... –

+0

@Layla no tiene que hacer nada para escribir en color, pero asegúrese de que está configurando correctamente los valores RGB para ese color, he agregado un par de ejemplos adicionales. –