tutorial pil library for python image python-imaging-library

pil - python image library



¿Usar PIL para hacer que todos los píxeles blancos sean transparentes? (3)

Debe realizar los siguientes cambios:

  • anexar una tupla (255, 255, 255, 0) y no una lista [255, 255, 255, 0]
  • use img.putdata(newData)

Este es el código de trabajo:

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

Estoy tratando de hacer que todos los píxeles blancos sean transparentes utilizando la Biblioteca de imágenes de Python. (Soy un pirata informático que intenta aprender Python, así que sé amable). Tengo la conversión funcionando (al menos los valores de píxel parecen correctos) pero no puedo entender cómo convertir la lista en un buffer para volver a crear la imagen. Aquí está el código

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


También puede usar el modo de acceso a píxeles para modificar la imagen in situ:

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


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