Python pillow image.putpixel((x,y),pixel) 不改变所有像素

Python pillow image.putpixel((x,y),pixel) doesn't change all the pixel

我想使用 image.putpixel((x,y),pixel) 更改给定图像的每个像素,但只有第一个元素(如果返回的图像)具有正确的值

代码如下:

def encode(text,image):
    #image.show()
    #for im in image.getdata():
        #print(im)

    pixels = image.load()
    text = ''.join(format(x,'b') for x in bytes(text,"ascii"))
    print(text)
    iteration = 0

    for i in range(image.size[0]):
        for j in range(image.size[1]):
            
            tmp = list(pixels[i,j])
            
            for k in range(len(tmp)):
                if iteration == len(text)-1:
                    return image
                
                elif text[iteration]=="0":
                    if tmp[k]%2!=0:
                        if tmp[k]==255:
                            tmp[k]-=1
                        else:
                            tmp[k]+=1
                            
                            
                elif text[iteration]=="1":
                    if tmp[k]%2==0:
                        tmp[k]+=1
                        
                iteration +=1


            pixel = tuple(tmp)
            image.putpixel((i,j),pixel)
            print(f"pixel : {pixels[i,j]}")
    

                        



if __name__ == "__main__":
    img = Image.open("C:/Users/Toavina/Pictures/Crypto/icon.PNG")
    
    img = encode("test_data",img)

    #New pixel
    for pixel in img.getdata():
        print(pixel)
    

异常值:(如果我在编码函数上打印值,则每个像素的值)

像素:(253, 253, 253, 254)

像素:(253、252、252、255)

像素:(253、252、252、255)

像素:(252、253、253、255)

像素:(253、252、252、255)

像素:(253, 253, 253, 255)

像素:(252、253、252、254)

像素:(253、252、253、255)

像素:(253, 253, 253, 255)

像素:(253、252、252、255)

返回图像的值,只有第一个像素值正确:

(253, 253, 253, 254)

(252, 252, 252, 255)

(252, 252, 252, 255)

(252, 252, 252, 255)

(252, 252, 252, 255)

(252, 252, 252, 255)

(252, 252, 252, 255)

(252, 252, 252, 255)

(252, 252, 252, 255)

(252, 252, 252, 255)

我认为你的代码确实有效,只是

的迭代顺序
    for i in range(image.size[0]):
        for j in range(image.size[1]):

不同于

的迭代顺序
    for pixel in img.getdata():
        print(pixel)

尝试更改迭代方式 return 并打印出坐标和像素值,以便您确认。