函数需要1个参数,但给出了3个参数。

3

我试图将一张图片中的像素值更改为我列表中最接近的值,但是我无法弄清楚为什么无法更改像素值。

我尝试将图像转换为RGB或RGBA格式,但由于某种原因有时需要三个参数,有时需要四个参数。

im = Image.open('rick.png') # Can be many different formats.
rgb_im = im.convert('RGBA')
pix = im.load()

height, width = im.size
image = ImageGrab.grab()

COLORS = (
(0, 0, 0),
(127, 127, 127),
(136, 0, 21),
(237, 28, 36),
(255, 127, 39),
)
def closest_color(r, g, b, COLORS):
    min_diff = 9999
    answer = None
    for color in COLORS:
        cr, cg, cb = color
        color_diff = abs(r - cr) + abs(g - cg) + abs(b - cb)
        if color_diff < min_diff:
            answer = color
            min_diff = color_diff
    return answer


def read_color(height,width, COLORS, pix):
    for x in range(height):
        for y in range(width):
            r,g,b,a = rgb_im.getpixel((x,y))
            color = closest_color(r, g, b, COLORS) # color is returned as tuple
            pix[x,y] = color # Changing color value? -Here i get the error-



read_color(height,width, COLORS, pix)
im.save('try.png')

尽管closest_value返回一个参数,但我仍然经常遇到这个错误,我不知道为什么,谢谢你的帮助!

COLORS - 是一个颜色列表,我已经测试了closest_color()函数,它运行良好 错误信息:

'Exception has occurred: TypeError
function takes exactly 1 argument (3 given)
File "C:\Users\user\Desktop\תוכנות שעשיתי\program.py", line 133, in 
read_color
pix[x,y] = color
File "C:\Users\user\Desktop\תוכנות שעשיתי\program.py", line 137, in 
<module>
read_color(height,width, COLORS, pix)'

编辑!

显然,此代码对大多数图像有效,但不适用于所有图像,例如此图像无法使用,并出现以下错误 在此输入图片描述


我想强调一下,您也没有将 rgb_im 传递给 read_color 函数,是吗? - Andrew
@Chris 确定,我已经更新了帖子。 - yarin Cohen
请提供COLORS中前3个元素的示例。您确定它们是元组吗? - Chris
很遗憾,您没有在问题中添加示例图片,因此我无法重现该问题并找出如何防止其发生的方法。 - Stop harming Monica
更新:添加了一张对我无效的示例图片。 - yarin Cohen
显示剩余6条评论
1个回答

3

您的行为不一致,因为您从RGBA转换后的图像中读取像素,但在原始的可能不是RGBA的图像中设置像素。修复这个问题可以使您的代码与示例图像一起工作。

pix = rgb_im.load()

哇,我简直不敢相信这就是问题所在,哈哈,非常感谢你! :) - yarin Cohen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接