Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-无法解压缩不可iterable int对象_Python_Python Imaging Library_Unpack - Fatal编程技术网

Python-无法解压缩不可iterable int对象

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

我正在尝试使用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 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模式打开。