2016-04-25 44 views
4

所以我正在研究這個學校項目(我知道真正的基本編程,而python是我唯一知道的語言),在那裏我需要改變我的像素顏色來編碼圖片中的消息,但PIL的putpixel似乎沒有工作,這裏是我的代碼。python的putpixel()不起作用

PS:我所有的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因爲某些原因不工作。正如我所說,我是編程新手,非常抱歉,如果它包含愚蠢的錯誤。

+0

嗯,我會說這是不是一個壞的問題,是你的第一個。但是,試着多解釋一下錯誤是什麼。如果您沒有看到任何錯誤,請告訴我們您得到的是什麼與期望的結果。請記住,您解釋問題所付出的努力越多,社區越容易幫助您。 –

+0

以及即時通訊沒有得到任何錯誤,像素只是根本不改變,就像putpixel沒有做什麼,我不認爲我做了什麼錯誤 –

+0

好吧,嘗試添加一些調試線。瞭解發生了什麼。例如,您可以在'a = input('Your message?')'語句下面添加'print a',並確保您實際存儲了您期望的值。以同樣的方式,添加幾個'print'語句。 –

回答

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

不同之處在於,但它只是幾個單個像素。如果我計算原始圖像和新圖像之間的差異,則會在中間左側看到它,存儲在test2.png中。爲了增強對比度,我「平衡」了圖像。

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

+0

我不想改變圖片的外觀,我只是想通過改變像素的R到匹配字符的ascii代碼,所以我可以稍後解碼消息。我可能會讓你的觀點錯誤,所以我會很高興,如果你能解釋更多 –

+0

我的觀點是:你的程序正在工作。您保存的圖像與原始圖像不同。但是如果我要編碼的文本是「測試」,那麼你只能修改4個單個像素(len(a)= 4),所以你不會用肉眼看到差異。這就是爲什麼我減去原始圖像和新圖像的原因,所以只剩下差異。由於差值很小(ord(a [i])在60左右),所以我通過對其進行均衡放大了灰度值。 – tfv