Pillow es una super libreria para el trabajo con imagenes en python que a su vez es un fork de otra super libreria llamada PIL.
Hace varios dias tenia que descargar / generar al rededor de 80 iconos de un color en particular estos, resulta que dicho color no era el que necesitaba :/ y tenia que cambiar estas 80 imagenes o descargarlas nuevamente, algo que no iba a pasar, pero bueno soy programador y pos recorde esta libreria Pillow :).
Instalacion
pip install Pillow
Pillow y PIL no pueden estar instalados en el mismo entorno, asi que a desinstalar PIL en caso de tenerla instalada.
Ahora como cambiar el color de un pixel usando Pillow
from PIL import Image
imagen = Image.load('imagen.jpg')
pixeles = im.load()
pixeles[0,0] = (33,150,243)
imagen.save("nueva_imagen.jpg")
De esta forma se cambia un el color a un pixel usando pillow y python.
Bueno, el caso de uso que me toco solucionar fue cambiar el color del icono y como estos eran iconos de un solo color, solo tenia que identificar el color en el píxel y si era el color que quería cambiar pues lo cambiaría. Bueno aquí mi solución.
#Ambos colores son colores aleatorios
color_actual = (33,150,243)
color_nuevo = (0,172,193)
icono = Image.open('icono.png')
icono = im.convert("RGBA")
pixels = im.load()
width, height = icono.size
for x in range(width):
for y in range(height):
r, g, b, a = pixels[x, y]
if (r, g, b) == color_actual:
pixels[x, y] = (color_nuevo[0], color_nuevo[1], color_nuevo[2], a)
icono.save("icono_nuevo_color.png")
Esta es una solución bien basica y funciona, pero puede ser mejor como todo en la vida, esta nueva solución mejorada utiliza la potencia de Numpy para trabajar con arreglos.
import Image
import numpy as np
color_nuevo = (0,172,193)
color_actual = (33,150,243)
icono = Image.open('icono.png')
icono = im.convert("RGBA")
data = np.array(icono)
data[(data == color_actual).all(axis = -1)] = color_nuevo
icono_nuevo = Image.fromarray(data, 'RGBA')
icono_nuevo.save('nuevo_icono.png')
Esta solución la encontre en StackOverflow
Espero que este tutorial le sea de ayuda a mas de uno. 🙂