Después de de nuestra extensa búsqueda de datos hemos podido solucionar este disgusto que suelen tener algunos lectores. Te compartimos la solución y deseamos que sea de mucha apoyo.
Solución:
Sí, de esta manera:
im = Image.open('image.gif')
rgb_im = im.convert('RGB')
r, g, b = rgb_im.getpixel((1, 1))
print(r, g, b)
(65, 100, 137)
La razón por la que estaba obteniendo un solo valor antes con pix[1, 1]
se debe a que los píxeles GIF se refieren a uno de los 256 valores de la paleta de colores GIF.
Consulte también esta publicación de SO: valores de píxeles de Python y PIL diferentes para GIF y JPEG y esta página de referencia de PIL contiene más información sobre el convert()
función.
Por cierto, su código funcionaría bien para .jpg
imágenes
Los GIF almacenan colores como uno de x número de colores posibles en una paleta. Lea acerca de la paleta de colores gif limitada. Entonces, PIL le brinda el índice de paleta, en lugar de la información de color de ese color de paleta.
Editar: Se eliminó el enlace a una solución de publicación de blog que tenía un error tipográfico. Otras respuestas hacen lo mismo sin el error tipográfico.
Una alternativa a la conversión de la imagen es crear un índice RGB a partir de la paleta.
from PIL import Image
def chunk(seq, size, groupByList=True):
"""Returns list of lists/tuples broken up by size input"""
func = tuple
if groupByList:
func = list
return [func(seq[i:i + size]) for i in range(0, len(seq), size)]
def getPaletteInRgb(img):
"""
Returns list of RGB tuples found in the image palette
:type img: Image.Image
:rtype: list[tuple]
"""
assert img.mode == 'P', "image should be palette mode"
pal = img.getpalette()
colors = chunk(pal, 3, False)
return colors
# Usage
im = Image.open("image.gif")
pal = getPalletteInRgb(im)
Sección de Reseñas y Valoraciones
Si guardas algún enigma y capacidad de afinar nuestro enunciado te recomendamos realizar una observación y con deseo lo leeremos.