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