2009-04-19 17 views
38

Sto cercando di rendere trasparenti tutti i pixel bianchi utilizzando la libreria di immagini Python. (Sono un hacker C che sta cercando di imparare Python quindi sii gentile) Ho la conversione funzionante (almeno i valori dei pixel sembrano corretti) ma non riesco a capire come convertire la lista in un buffer per ri crea l'immagine. Ecco il codiceUsare PIL per rendere trasparenti tutti i pixel bianchi?

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

risposta

49

è necessario effettuare le seguenti modifiche:

  • aggiungere una tupla (255, 255, 255, 0) e non una lista [255, 255, 255, 0]
  • uso img.putdata(newData)

Questo è il codice di lavoro:

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

Giusto per potenzialmente al sicuro un po 'di tempo: se si sta lavorando con python3 si deve andare per cuscino (http: //python-pillow.org/) invece di PIL. – davedadizzel

36

È inoltre possibile utilizzare la modalità di accesso dei pixel per modificare l'immagine sul posto:

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

non è una tupla di tipo mutabile? – DataGreed

+0

Come punto di riferimento sull'efficienza, il ciclo precedente richiede circa 0,05 secondi su un'immagine 256x256 sulla mia macchina media. È più veloce di quanto mi aspettassi. –

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]); 
Problemi correlati