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 并打印出坐标和像素值,以便您确认。
我想使用 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 并打印出坐标和像素值,以便您确认。