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