2009-04-19 8 views
38

Próbuję uczynić wszystkie białe piksele przezroczystymi za pomocą Biblioteki obrazów Python. (Jestem hackerem C próbującym nauczyć się Pythona, więc bądź łagodny) Mam działającą konwersję (przynajmniej wartości pikseli wyglądają poprawnie), ale nie mogę wymyślić, jak przekonwertować listę do bufora utwórz obraz. Oto kodUżycie polecenia PIL w celu uczynienia wszystkich białych pikseli przezroczystymi?

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

Odpowiedz

49

Trzeba wprowadzić następujące zmiany:

  • dołączyć krotki (255, 255, 255, 0) a nie listy [255, 255, 255, 0]
  • użytkowania img.putdata(newData)

Jest to kod pracy:

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

Wystarczy potencjalnie bezpiecznego Ci jakiegoś czasu: Jeśli pracujesz z Python3 trzeba iść do poduszek (http: //python-pillow.org/) zamiast PIL. – davedadizzel

36

Można również użyć trybu dostępu pikseli zmodyfikować obraz w miejscu:

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

nie jest krotką typu zmiennego? – DataGreed

+0

Jako punkt odniesienia dla wydajności, powyższa pętla zajmuje około 0,05 sekundy na obrazie 256x256 na mojej przeciętnej maszynie. To szybciej, niż się spodziewałem. –

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