неподписанный объект - PullRequest
       13

неподписанный объект

1 голос
/ 22 марта 2009

Я использую 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

Проблема в том, что в некоторых (очень мало, в частности, не знаю, почему именно эти простые jpegs) я получаю «неподписанный объект» в строке «colors [0]». Пробовал:

if colors: 

становится правдой и продолжается.

if len(colors):

дает 'len () объекта без размера'

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

Ответы [ 3 ]

4 голосов
/ 22 марта 2009

Из документов 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.

Похоже, что некоторые из ваших изображений являются многослойными, а некоторые однослойными.

2 голосов
/ 22 марта 2009

Хорошо, дело в том, что когда черно-белые изображения не имеют полосы RGB (L-полосы), она возвращает целое число с единственным значением цвета пикселя, а не список значений 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}
2 голосов
/ 22 марта 2009

Как отмечено в другом ответе, 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

Второй путь, вероятно, более Pythonic.

...