Вопрос

Я использую 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() объекта без размера'

  1. Какое условие я должен применить, чтобы не получить это исключение?
  2. В чем причина этой проблемы?
Это было полезно?

Решение

Из документов 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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top