我正在使用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]“行上得到'unsubscriptable object'。尝试:
if colors:
变为现实并继续。
if len(colors):
给出'未定义对象的len()'
答案 0 :(得分:4)
来自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.
所以看起来你的一些图像是多层的,有些是单层的。
答案 1 :(得分:2)
如另一个答案所述,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。
答案 2 :(得分:2)
好的情况是,当B& W图像没有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}