Python-无法解压缩不可iterable int对象
我正在尝试使用PIL图像库获取图像的像素RGB 使用此代码,我遇到了错误:Python-无法解压缩不可iterable int对象,python,python-imaging-library,unpack,Python,Python Imaging Library,Unpack,我正在尝试使用PIL图像库获取图像的像素RGB 使用此代码,我遇到了错误: for i in range(width): for j in range(height): r,g,b=(image.getpixel((i,j))) #THIS LINE IS REFERENCED IN ERROR MESSAGE print("leds[",j,"] = CRGB(",r, "," ,g, ",", b, ");") #print pixel colorc
for i in range(width):
for j in range(height):
r,g,b=(image.getpixel((i,j))) #THIS LINE IS REFERENCED IN ERROR MESSAGE
print("leds[",j,"] = CRGB(",r, "," ,g, ",", b, ");") #print pixel colorchange to console
del image
line 18, in <module>
r,g,b=(image.getpixel((i,j))) #Get pixel at coordinate
TypeError: cannot unpack non-iterable int object
为什么会出现这个错误?
对我来说,这似乎真的很奇怪。我输入了两张图片,效果很好。但是,当我在图像中的某个位置有白色像素时,我会得到错误:
for i in range(width):
for j in range(height):
r,g,b=(image.getpixel((i,j))) #THIS LINE IS REFERENCED IN ERROR MESSAGE
print("leds[",j,"] = CRGB(",r, "," ,g, ",", b, ");") #print pixel colorchange to console
del image
line 18, in <module>
r,g,b=(image.getpixel((i,j))) #Get pixel at coordinate
TypeError: cannot unpack non-iterable int object
有效的图像:
,
不起作用的图像:
此图像右侧有几个白色像素
完整代码。问题似乎是您正在查看的图像不是RGB图像。如果查看image.getbands或image.mode,您将看到图像处于模式P 在此模式下,每个像素存储一个数字,而不是直接为每个像素存储值颜色值,该数字是图像调色板的索引,可通过访问该数字。调色板本身可以有多种模式,但对于这个特定的图像,它是一个RGB调色板,其形式为[r0、g0、b0、r1、g1、b1,…] 因此,获取图像实际像素值的一种方法是检查模式并手动获取r、g、b值
palette = image.getpalette()
for i in range(width):
for j in range(height):
index = image.getpixel((i, j)) # index in the palette
base = 3 * index # because each palette color has 3 components
r, g, b = palette[base:base+3]
然而,在这种情况下,有一条捷径;您可以使用适当命名的模式在模式之间转换
但是,请注意,如果遇到使用其他模式的图像,盲目使用convert可能会产生意外的后果,而不会导致任何Python错误。问题似乎是您正在查看的图像不是RGB图像。如果查看image.getbands或image.mode,您将看到图像处于模式P 在此模式下,每个像素存储一个数字,而不是直接为每个像素存储值颜色值,该数字是图像调色板的索引,可通过访问该数字。调色板本身可以有多种模式,但对于这个特定的图像,它是一个RGB调色板,其形式为[r0、g0、b0、r1、g1、b1,…] 因此,获取图像实际像素值的一种方法是检查模式并手动获取r、g、b值
palette = image.getpalette()
for i in range(width):
for j in range(height):
index = image.getpixel((i, j)) # index in the palette
base = 3 * index # because each palette color has 3 components
r, g, b = palette[base:base+3]
然而,在这种情况下,有一条捷径;您可以使用适当命名的模式在模式之间转换
但是,请注意,如果您遇到使用其他模式的图像,盲目使用convert可能会产生意外的后果,但不会导致任何Python错误。这些图像都是相同维度的吗?是的,它们都是64x8 W,H像素。看起来图像可能不是多层图像,因此像素值是整数,而不是元组,如中所述。此外,代替使用打印的字符串级联,您可能需要考虑使用A,例如Frds[{j} ]=CRGB {R},{g},{b}。@ jiasimk什么是多层图像,为什么会是这个问题?它适用于其他图像,但不适用于侧面有白色像素的单个图像。文档表明getpixel仅针对文档中包含多个通道的图像返回元组,我不确定文档在这种情况下为什么使用多层,除非它还针对某些图像格式引用了其他内容。。查看您提供的图像,这似乎是问题所在。这些图像都是相同的维度吗?是的,它们都是64x8 W,H像素。看起来图像可能不是多层图像,因此像素值是整数,而不是元组,如中所述。此外,代替使用打印的字符串级联,您可能需要考虑使用A,例如Frds[{j} ]=CRGB {R},{g},{b}。@ jiasimk什么是多层图像,为什么会是这个问题?它适用于其他图像,但不适用于侧面有白色像素的单个图像。文档表明getpixel仅针对文档中包含多个通道的图像返回元组,我不确定文档在这种情况下为什么使用多层,除非它还针对某些图像格式引用了其他内容。。看看你提供的图片,这似乎是问题所在。谢谢你的回答。剩下的唯一问题是,在RGB模式的图像上再添加几个像素如何将其转换为P模式?这是否与paint.net导出.png图像的方式有关,或者是导致模式更改的白色像素数有关?这与图像的创建方式有关,而不是与图像的内容有关:如果保存image.convert'RGB'的结果,它将看起来完全相同,但是如果你用PIL再次打开它,它将以RGB模式打开。谢谢你的回答。剩下的唯一问题是,在RGB模式的图像上再添加几个像素如何将其转换为P模式?这与paint.net导出.png图像的方式有关吗?或者可能是白色像素的计数导致模式的改变?这与图像的创建方式有关,而不是与图像的内容有关:如果保存图像的结果。转换为“RGB”,它将看起来完全相同,但如果再次使用PIL打开它,它将以RGB模式打开。