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'

  1. ¿En qué condiciones debería no ser aplicables para obtener esta excepción?
  2. ¿Cuál es la causa del problema?
¿Fue útil?

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}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top