python 的 putpixel() 不工作

python's putpixel() isn't working

所以我在做这个学校项目(我知道真正的基本编程,python 是我唯一知道的语言)我需要改变我的像素颜色来编码图片中的信息,但是PIL 的 putpixel 似乎不起作用,这是我的代码。

P.S.: 我所有的 PIL 信息都是自学的,英语不是我的主要语言,所以如果你能简单地说一下,我将不胜感激

from PIL import Image
e=input('file and location?  ')
img=Image.open(e)
pmap=img.load()
imy=img.height
imx=img.width
if int(input('1 for encoding, 2 for decoding   '))==1:
    a=input('Your message?   ')
    for i in range(len(a)):
        r , g , b=img.getpixel((i+10,imy//2))
        img.putpixel((i+10,imy//2),(ord(a[i]),g,b))
    r,g,b=img.getpixel((len(a)+10,imy//2))
    img.putpixel((len(a)+10,imy//2),(999,g,b)) #999 is the stop code in     decoding
else:
    r=u=0
    m=''
    while r!=999:
        r , g , b=img.getpixel((10+u,imy//2))
        m+=chr(r)
        u+=1
    print(m[:len(a)-1])
img.save(e)

请记住,我不想在视觉上产生差异,我已经完成了 debugging.There 也没有错误,但 putpixel 出于某种原因无法正常工作。 正如我所说,我是编程新手,如果其中包含愚蠢的错误,我深表歉意。

区别是有的,只是几个像素而已。如果我计算原始图像和新图像之间的差异,您会在中间左侧看到它,存储在 test2.png 中。为了增强对比度,我有 "equalized" 图像。

from PIL import Image, ImageChops, ImageOps

img=Image.open("image.jpg")
pmap=img.load()
img2=img.copy()
imy=img.height
imx=img.width
if int(input('1 for encoding, 2 for decoding   '))==1:
    a=input('Your message?   ')
    for i in range(len(a)):
        r , g , b=img.getpixel((i+10,imy//2))
        img.putpixel((i+10,imy//2),(ord(a[i]),g,b))
    r,g,b=img.getpixel((len(a)+10,imy//2))
    img.putpixel((len(a)+10,imy//2),(999,g,b)) #999 is the stop code in     decoding
else:
    r=u=0
    m=''
    while r!=999:
        r , g , b=img.getpixel((10+u,imy//2))
        m+=chr(r)
        u+=1
    print(m[:len(a)-1])
img.save("test.png")
img3=ImageChops.difference(img, img2)
img3=ImageOps.equalize(img3)
img3.save("test2.png")

这是结果:

在使用您的代码并在图像上试用后,putpixel 可以按预期工作。像素的变化很难看到,这可能就是您认为它不起作用的原因。相信我,它是有效的,只是你看不到而已。

但是,我发现您的代码存在两个问题:

1) 999 不可编码

999 无法在单个像素中进行编码。一个像素的最大值是 255(范围是 0-255)。您需要选择一个不同的站点 code/sequence。我建议将停止代码更改为 255.

2)解码时,a从未被定义

您需要通过其他方式获取消息的长度。我建议用计数器来做:

counter = 0
while something:
    counter += 1

# do something with count here

总而言之,您的代码的工作版本如下所示:

e=input('file and location?  ')
img=Image.open(e)
pmap=img.load()
imy=img.height
imx=img.width
if int(input('1 for encoding, 2 for decoding   '))==1:
    a=input('Your message?   ')
    for i in range(len(a)):
        r , g , b= img.getpixel((i+10,imy//2))
        img.putpixel((i+10,imy//2),(ord(a[i]),g,b))
    r,g,b=img.getpixel((len(a)+10,imy//2))
    img.putpixel((len(a)+10,imy//2),(255,g,b)) #255 is the stop code in     decoding
else:
    r=u=0
    m=''
    message_length=0
    while r!=255:
        message_length+=1
        r , g , b=img.getpixel((10+u,imy//2))
        m+=chr(r)
        u+=1
    print(m[:message_length-1])
img.save(e)