2012-07-14 54 views
5

Tengo un conjunto de iconos blancos sobre fondo transparente, y me gustaría invertirlos todos para que sean negros sobre fondo transparente.Python: imagen invertida con fondo transparente (PIL, Gimp, ...)

enter image description here

han tratado con PIL (ImageChops) pero no parece trabajar con fondos transparentes. También probé la interfaz Python de Gimp, pero tampoco tuve suerte allí.

¿Alguna idea de cómo invertir se logra mejor en Python?

+0

¿Qué formato tienen las imágenes? – Acorn

+0

su formato de archivo es png – Hoff

Respuesta

5

ImageChops.invert parece que también invierte el canal alfa de cada píxel.

Esto debe hacer el trabajo:

import Image 

img = Image.open('image.png').convert('RGBA') 

r, g, b, a = img.split() 

def invert(image): 
    return image.point(lambda p: 255 - p) 

r, g, b = map(invert, (r, g, b)) 

img2 = Image.merge(img.mode, (r, g, b, a)) 

img2.save('image2.png') 
+0

En lugar de definir su propio 'invert()' podría simplemente usar 'ImageOps.invert()' en cada canal ya que cada canal tiene el tipo '" L "'. (o supongo 'ImageChops.invert()' pero nunca lo he probado). – Ray

1

He intentado el enfoque de la bellota, pero el resultado es un tanto extraña (parte superior de la imagen de abajo).

enter image description here

El icono inferior es lo que realmente quería, he logrado mediante el uso de Image Magick 's se convierten método:

convert tools.png -negate tools_black.png

(no pitón per se, sino que existen envoltorios de pitón, como PythonMagickWand.

El único inconveniente es que tiene que instalar un conjunto de dependencias para que ImageMagick funcione, pero parece ser una poderosa imagen mani marco de trabajo

+0

Derecha, el código que publiqué solo convertía píxeles blancos a negro. He actualizado mi respuesta con una inversión genérica. – Acorn

0

Usted puede hacer esto con bastante facilidad con PIL, así:

  1. Asegúrese de que la imagen se representa como RGBA, mediante el uso de convert('RGBA').
  2. Divida la imagen en bandas separadas RGBA.
  3. Haz lo que quieras con las bandas RGB (en tu caso las configuramos todas en negro usando la función point), pero no toques la banda alfa.
  4. Combina las bandas.

aquí está el código:

import Image 
im = Image.open('image.png') 
im = im.convert('RGBA') 
r, g, b, a = im.split() 
r = g = b = r.point(lambda i: 0) 
im = Image.merge('RGBA', (r, g, b, a)) 
im.save('saved.png') 

darle un tiro.

0
import Image, numpy 
pixels = numpy.array(Image.open('myimage.png')) 
pixels[:,:,0:3] = 255 - pixels[:,:,0:3] # invert 
Image.fromarray(pixels).save('out.png') 

Probablemente la solución más rápida hasta ahora, ya que no interpreta ningún código de Python dentro de un bucle "por cada píxel".

Cuestiones relacionadas