更改图像中的像素值

Changing the value of pixel in an image

我正在使用速记技术。我需要在 image.But 的像素中隐藏数据 我在尝试更新像素值时遇到问题。我试过下面的代码:

from PIL import Image

im = Image.open('./data/frame398.png')
pix = im.load()
r, g, b = pix[200,200]
print("Pre RGB")
print(r, g, b)
pix[200,200] = 0,0,0  

应该将像素值改为(0,0,0)。但事实并非如此。如果我尝试下面的代码:

imx = Image.open('./data/frame398.png')
pixx = imx.load()
r, g, b = pixx[200,200]
print("Post RGB")
print(r, g, b)

我得到以下输出:

Pre RGB
69 62 65
Post RGB
69 62 65

我得到的不是 (0,0,0),而是旧值。我做错了什么?我需要 help.Thanks

当你

r, g, b = pixx[200,200]

您正在卸载元组或数组中的像素值。所以你最好的选择是

pixel[200,200] = (0, 0, 0)
#or
pixel[200,200] = [0, 0, 0]

您正在成功更改图像,但如果要再次读取,需要将其写入文件:

要保存到同一个图像文件只需执行

im.save('./data/frame398.png', ‘PNG’)

我运行下面的代码并得到了预期的输出。

from PIL import Image

im = Image.open('image.jpg')
pix = im.load()

r, g, b = pix[200,200]
print("Pre RGB")
print(r, g, b)

pix[200,200] = 0,0,0

r, g, b = pix[200,200]
print("Post RGB")
print(r, g, b)

输出:

Pre RGB
172 196 220
Post RGB
0 0 0

正如在回答中提到的,你实际上需要用Image.save()来拯救法师。

其次,如果您想使用像素值,最好将加载的图像转换为 numpy 数组,例如,

import numpy as np
im = Image.open('./data/frame398.png')
im = np.array(im)

这使像素操作变得更加简单,只需注意创建原始图像的副本,例如,

im = np.array(im)
im = im.copy()

如果某个时候没有制作副本python 不允许直接赋值。

之后,您可以轻松更改单个值,例如,

im[0, 0, 0] = 255 # Complete RED
im[0, 0, 1] = 0 # No green
im[0, 0, 2] = 0 # No blue

而且保存图片也超级简单,

Image.fromarray(im).save('name_of_file.png', 'PNG')


我们也给了类似的隐写术任务,如果你有兴趣可以查看完整代码here.