2009-04-19 9 views
38

私はすべての白いピクセルをPython Image Libraryを使って透明にしようとしています。 (私は、Cのハッカーは、穏やかなので、Pythonを学ぶしようとしている) 私は変換作業を持っている(少なくともピクセル値が正しいように見える)が、私はどのようにリストをバッファに再変換するには、イメージを作成します。ここでは、次の変更を加える必要があり、コードPILを使用してすべての白いピクセルを透明にしますか?

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

答えて

49

です:

  • [255, 255, 255, 0]
  • 使用img.putdata(newData)

これは、作業コードでタプル(255, 255, 255, 0)はなく、リストを追加します

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

ただ、潜在的に安全なあなたいくつかの時間に:あなたはのpython3で作業している場合は、枕(HTTPのために行く必要があります: //python-pillow.org/)を使用してください。 – davedadizzel

36

また、その場で画像を修正するためにピクセル・アクセス・モードを使用することができます。

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

はタプル型の可変型ではありませんか? – DataGreed

+0

効率の基準として、私の平均的なマシンの256x256画像で上記のループは約0.05秒かかります。それは私が予想していたよりも速いです。 –

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