объект, не подлежащий подписке
-
21-08-2019 - |
Вопрос
Я использую 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
Проблема в том, что на нескольких (очень немногих, в частности, я не знаю, почему именно на этих, простых файлах jpeg) Я получаю "объект, не подлежащий подписке" в строке "цвета [0]".Пытался:
if colors:
становится правдой и продолжается дальше.
if len(colors):
выдает 'len() объекта без размера'
- Какое условие я должен применить, чтобы не получить это исключение?
- В чем причина этой проблемы?
Решение
Из документов 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.
Таким образом, кажется, что некоторые из ваших изображений многослойные, а некоторые - однослойные.
Другие советы
Как отмечено в другом ответе, getpixel
возвращает либо одно значение, либо кортеж.Вы можете проверить тип и выполнить соответствующее действие следующими способами:
if isinstance(colors, tuple):
color = colors[0]
else:
color = colors
# Do other stuff
или:
try:
color = colors[0]
except: # Whatever the exception is - IndexError or whatever
color = colors
# Do other stuff
Второй способ, вероятно, более питонический.
Хорошо, дело было в том, что когда черно-белые изображения не имеют полосы RGB (L band), оно возвращает целое число с единственным значением цвета пикселя, а не список значений rgb.Решение состоит в том, чтобы проверить диапазоны
im.getbands()
или чем проще для моих нужд было:
if isinstance(colors, tuple):
values = {'r':colors[0], 'g':colors[1], 'b':colors[2]}
else:
values = {'r':colors, 'g':colors, 'b':colors}