2016-04-25 3 views
4

私はこの学校プロジェクトに取り組んでいました。(私は本当に基本的なプログラミングを知っていて、私が知っている唯一の言語です)ピクチャにメッセージをエンコードするためにピクセル色を変更する必要があります、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

OK、いくつかのデバッグ行を追加してみてください。何が起こっているのか理解する。例えば、 '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

違いはありますが、単なる1ピクセルです。元の画像と新しい画像の差を計算すると、左の中央に表示されます(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を一致する文字に変更するだけでメッセージをエンコードしたいアスキーコードだから私は後でメッセージを解読することができます。あなたのポイントが間違っているかもしれないので、もっと説明できるならば嬉しいです –

+0

私のポイントは:プログラムが動作しています。保存するイメージは元のイメージとは異なります。しかし、エンコードするテキストが「テスト」の場合、4つの単一ピクセル(len(a)= 4)を変更するだけなので、肉眼では違いは見えません。これが元画像と新しい画像を差し引いたものであるため、差異だけが残ります。そして、差は値が小さいので(ord(a [i])は約60です)、私はそれをイコライズしてグレー値を増幅しました。 – tfv

関連する問題