objeto unsubscriptable
-
21-08-2019 - |
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'
- Que condição que eu não deveria aplicar para obter essa exceção?
- O que é a causa do problema?
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}