Gráficos en Python

En el desarrollo de un proyecto de Arte y Nuevas Tecnologías, que tiene mucho que ver con lo que hemos hecho con ArtCube, estamos pensando en descomponer una imagen en “partículas” para luego jugar con ellas. A la hora de ponerme a cacharrear con las imágenes, me he decidido tirar con Python, y la verdad que, por ahora, estoy más que contento con esta decisión.

Buscando por la red he encontrado un excelente tutorial de manejo de gráficos con Python, muy centrado en la utilización de PIL (Python Imaging Library). La verdad que con esta librería se pueden hacer muchas virguerías de forma muy simple, ya que facilita muchísimo el acceso a las imágenes. Por ahora he hecho una chorradilla, partimos de una foto determinada, p.e:


Cargamos la foto con PIL y generamos una versión “pixelada” de la foto. Para ello basta con coger un pixel de cada NxN píxeles y pintar un cuadrado de NxN con el color del píxel original. El resultado:


Eliminamos los píxeles (más bien los cuadrados de píxeles) muy oscuros y los muy claros, quedando algo así:


Y convertimos estos cuadrados en círculos


Ahora queda la parte más divertida, que es “dar vida” a estas nuevas partículas, pero ya lo abordaré otro día. Todo el proceso que he comentado con los pasos anteriores se hace de una forma más directa, con el siguiente código:


def drawFrame(image, image2):

# get pixels
pixels = list(image.getdata())
pixels2 = list( image2.getdata() )

# fixed pixel values
white = (255, 255, 255)

# paste pixels back into picture
for y in range(height):
yp = y * width
for x in range(width):
xy = yp + x
p = pixels[xy]

#codigo para pixelar

bn = p[0] * 30 + p[1] * 59 + p[2] * 11
print( bn )

#Si es muy oscura la imagen, la borramos
if( bn < 10000 ):
p = white
#Si es muy clara, tambien
if( bn > 15000 ):
p = white

#Si es blanco, pintamos un cuadro blanco
if( p == white ):
for y2 in range( tamanho_cuadro ):
yp2 = ( y * tamanho_cuadro ) * width_final + ( y2 * width_final )
for x2 in range( tamanho_cuadro ):
xp = yp2 + ( x * tamanho_cuadro ) + x2
pixels2[xp] = p
#Si es de otro color, pintamos el circulo
else:
for y2 in range( tamanho_cuadro ):
yp2 = ( y * tamanho_cuadro ) * width_final + ( y2 * width_final )
for x2 in range( tamanho_cuadro ):
xp = yp2 + ( x * tamanho_cuadro ) + x2
if( insideCircle(12, 12, x2, y2, 12.5) ):
pixels2[xp] = p
else:
pixels2[xp] = white

image2.putdata(pixels2)