2009-04-19 5 views
38

J'essaie de rendre tous les pixels blancs transparents en utilisant la bibliothèque d'images Python. (Je suis un hacker C essayant d'apprendre python alors soyez gentil) J'ai la conversion de travail (au moins les valeurs de pixel semblent correctes) mais je ne peux pas comprendre comment convertir la liste en un tampon pour re créer l'image. Voici le codeUtiliser PIL pour rendre tous les pixels blancs transparents?

img = Image.open('img.png') 
imga = img.convert("RGBA") 
datas = imga.getdata() 

newData = list() 
for item in datas: 
    if item[0] == 255 and item[1] == 255 and item[2] == 255: 
     newData.append([255, 255, 255, 0]) 
    else: 
     newData.append(item) 

imgb = Image.frombuffer("RGBA", imga.size, newData, "raw", "RGBA", 0, 1) 
imgb.save("img2.png", "PNG") 

Répondre

49

Vous devez apporter les modifications suivantes:

  • ajouter un tuple (255, 255, 255, 0) et non une liste [255, 255, 255, 0]
  • utilisation img.putdata(newData)

Voici le code de travail:

from PIL import Image 

img = Image.open('img.png') 
img = img.convert("RGBA") 
datas = img.getdata() 

newData = [] 
for item in datas: 
    if item[0] == 255 and item[1] == 255 and item[2] == 255: 
     newData.append((255, 255, 255, 0)) 
    else: 
     newData.append(item) 

img.putdata(newData) 
img.save("img2.png", "PNG") 
+4

Juste pour potentiellement vous sûr un certain temps: Si vous travaillez avec python3 vous devez aller pour Pillow (http: //python-pillow.org/) au lieu de PIL. – davedadizzel

36

Vous pouvez également utiliser le mode d'accès de pixels pour modifier l'image en place:

from PIL import Image 

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

pixdata = img.load() 

width, height = image.size 
for y in xrange(height): 
    for x in xrange(width): 
     if pixdata[x, y] == (255, 255, 255, 255): 
      pixdata[x, y] = (255, 255, 255, 0) 

img.save("img2.png", "PNG") 
+0

n'est pas un tuple de type mutable? – DataGreed

+0

Comme point de référence sur l'efficacité, la boucle ci-dessus prend environ 0,05 secondes sur une image 256x256 sur ma machine moyenne. C'est plus rapide que ce à quoi je m'attendais. –

5
import Image 
import ImageMath 

def distance2(a, b): 
    return (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]) + (a[2] - b[2]) * (a[2] - b[2]) 

def makeColorTransparent(image, color, thresh2=0): 
    image = image.convert("RGBA") 
    red, green, blue, alpha = image.split() 
    image.putalpha(ImageMath.eval("""convert(((((t - d(c, (r, g, b))) >> 31) + 1)^1) * a, 'L')""", 
     t=thresh2, d=distance2, c=color, r=red, g=green, b=blue, a=alpha)) 
    return image 

if __name__ == '__main__': 
    import sys 
    makeColorTransparent(Image.open(sys.argv[1]), (255, 255, 255)).save(sys.argv[2]); 
Questions connexes