objeto unsubscriptable
-
21-08-2019 - |
Pregunta
Estoy usando PIL
im = Image.open(teh_file)
if im:
colors = im.resize( (1,1), Image.ANTIALIAS).getpixel((0,0)) # simple way to get average color
red = colors[0] # and so on, some operations on color data
El problema es que, en unos pocos (muy pocos, particularmente no sé por qué exactamente los que, jpeg simples) recibo el mensaje 'objeto unsubscriptable' en "colores [0]" de línea. Intentado:
if colors:
obtiene verdadera y continúa.
if len(colors):
da 'len () del objeto sin encolar'
- ¿En qué condiciones debería no ser aplicables para obtener esta excepción?
- ¿Cuál es la causa del problema?
Solución
A partir de los documentos PIL:
getpixel
im.getpixel(xy) => value or tuple
Returns the pixel at the given position. If the image is a multi-layer image, this method returns a tuple.
Así que parece que algunas de sus imágenes son de varias capas, y algunos son de una sola capa.
Otros consejos
Como se ha señalado en otra respuesta, getpixel
devuelve un único valor o una tupla. Se puede comprobar el tipo y realizar la acción apropiada de las siguientes maneras:
if isinstance(colors, tuple):
color = colors[0]
else:
color = colors
# Do other stuff
o
try:
color = colors[0]
except: # Whatever the exception is - IndexError or whatever
color = colors
# Do other stuff
La segunda forma es probablemente más Pythonic.
Bueno, el caso es, que cuando de imágenes en blanco no tienen banda RGB (banda L), que devuelve un entero con el valor de un solo color de píxeles, no una lista de valores RGB. La solución es comprobar bandas
im.getbands()
o la más simple para mis necesidades fue:
if isinstance(colors, tuple):
values = {'r':colors[0], 'g':colors[1], 'b':colors[2]}
else:
values = {'r':colors, 'g':colors, 'b':colors}