python的putpixel()不起作用

时间:2016-04-25 17:02:17

标签: python python-imaging-library

所以我正在研究这个学校项目(我知道非常基本的编程,而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)

请记住,我没有想要产生视觉差异,而且我已经完成了调试。也没有错误,但是putpixel因为某些原因无法工作。 正如我所说,我是编程的新手,如果它包含了愚蠢的错误,那就很抱歉。

2 个答案:

答案 0 :(得分:3)

使用代码并在图像上尝试后,putpixel正在按预期工作。很难看到像素的变化,这可能就是您认为它不起作用的原因。相信我,它正在发挥作用,你无法看到它。

但是,我在您的代码中看到了两个问题:

1)999不可编码

999无法在单个像素中进行编码。像素的最大值为255(范围为0-255)。您需要选择不同的停止代码/序列。我建议将停止代码更改为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) 

答案 1 :(得分:0)

存在差异,但它只是几个像素。如果我计算原始图像和新图像之间的差异,您将在中间左侧看到它,存储在test2.png中。为了增强对比度,我已经平衡了#34;图像。

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")

这是结果: enter image description here