Domanda

Sto 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

Il problema è che in pochi (pochissimi, particolarmente non so perché chi esattamente, semplici file JPEG) ottengo 'oggetto unsubscriptable' on line "colori [0]". Hai provato:

if colors: 

ottiene vero e prosegue.

if len(colors):

da 'len () dell'oggetto non calibrati'

  1. In che condizioni dovrei non si applica per ottenere questa eccezione?
  2. Qual è la causa del problema?
È stato utile?

Soluzione

Dalla documentazione 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.

Così sembra che alcune delle immagini sono a più strati, e alcuni sono solo strato.

Altri suggerimenti

Come notato in un'altra risposta, getpixel restituisce un unico valore o una tupla. Si potrebbe verificare il tipo e fare l'azione appropriata nei seguenti modi:

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

o

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

Il secondo modo è probabilmente più Pythonic.

Ok caso era, che quando B & W immagini hanno alcuna banda RGB (banda L), si restituisce un intero con il singolo valore del pixel, non un elenco di valori RGB. La soluzione è di controllare in bande

im.getbands()

o il più semplice per le mie esigenze era:

        if isinstance(colors, tuple):
            values = {'r':colors[0], 'g':colors[1], 'b':colors[2]}
        else:
            values = {'r':colors, 'g':colors, 'b':colors}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top