Pergunta

Eu estou 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

O problema é que, em alguns (muito poucos, particularmente não sei por que aqueles exatamente, jpegs simples) I get 'objeto unsubscriptable' na linha "cores [0]". Tentou:

if colors: 

fica verdadeira e continua.

if len(colors):

dá 'len () do objeto unsized'

  1. Que condição que eu não deveria aplicar para obter essa exceção?
  2. O que é a causa do problema?
Foi útil?

Solução

De docs 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.

Assim, parece que algumas de suas imagens são múltiplas camadas, e alguns são de camada única.

Outras dicas

Como observado em outra resposta, getpixel retorna um único valor, ou uma tupla. Você pode verificar o tipo e fazer a ação apropriada das seguintes formas:

if isinstance(colors, tuple):
    color = colors[0]
else:
    color = colors
# Do other stuff

ou

try:
    color = colors[0]
except: # Whatever the exception is - IndexError or whatever
    color = colors
# Do other stuff

A segunda maneira é provavelmente mais Pythonic.

Ok o caso era que, quando B & W imagens não têm banda RGB (banda L), ele retorna um inteiro com o valor único de cor pixel, não uma lista de valores RGB. A solução é verificar bandas

im.getbands()

ou a mais simples para as minhas necessidades foi:

        if isinstance(colors, tuple):
            values = {'r':colors[0], 'g':colors[1], 'b':colors[2]}
        else:
            values = {'r':colors, 'g':colors, 'b':colors}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top