2016-04-25 4 views
4

Also ich arbeitete an diesem Schulprojekt (ich kenne wirklich grundlegende Programmierung, und Python ist die einzige Sprache, die ich kenne), wo ich meine Pixelfarbe ändern muss, um eine Nachricht in einem Bild zu kodieren , aber PIL's putpixel scheint nicht zu funktionieren, hier ist mein Code.python's putpixel() funktioniert nicht

PS: Alle meine PIL Informationen sind Autodidakt und Englisch ist nicht meine Hauptsprache also, wenn Sie vereinfacht reden kann ich

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) 

dankbar sein würde Sie bitte daran, entblößt, dass ich nicht auf der Suche nach mache einen visuellen Unterschied und ich habe bereits Debugging gemacht. Es gibt auch keine Fehler, putpixel funktioniert aber aus irgendeinem Grund nicht. Wie gesagt, ich bin neu im Programmieren, tut mir leid, wenn es dumme Fehler enthält.

+0

Nun, ich würde sagen, es ist keine schlechte Frage Ihre erste ist . Versuchen Sie jedoch, ein wenig mehr zu erklären, was der Fehler ist. Wenn Sie keinen Fehler sehen, erzählen Sie uns, was Sie erhalten und was Sie erwarten. Denken Sie daran: Je mehr Mühe Sie haben, Ihre Probleme zu erklären, desto leichter kann die Gemeinschaft Ihnen helfen. –

+0

Nun, ich bekomme keine Fehler, die Pixel verändern sich überhaupt nicht, so wie der Putpixel nichts tut und ich glaube nicht, dass ich irgendwas falsch gemacht habe. –

+0

Ok, versuche ein paar Debug-Zeilen hinzuzufügen. Um zu verstehen, was vor sich geht. Sie könnten zum Beispiel 'print a' unter der Anweisung' a = input ('Ihre Nachricht?') Hinzufügen und sicherstellen, dass Sie tatsächlich den Wert speichern, den Sie erwarten. Auf die gleiche Weise fügen Sie ein paar weitere 'print' Anweisungen hinzu. –

Antwort

3

nach dem Code und es heraus auf ein Bild versucht, putpixel wie erwartet funktioniert. Die Änderung der Pixel ist sehr schwer zu sehen und das könnte der Grund sein, warum Sie glauben, dass es nicht funktioniert. Glaub mir, es funktioniert, du kannst es einfach nicht sehen.

Allerdings gibt es zwei Probleme, die ich mit dem Code sehen:

1) 999 ist nicht kodierbaren

999 kann nicht in einem einzigen Pixel codiert werden. Der maximale Wert für ein Pixel ist 255 (Der Bereich ist 0-255). Sie müssen einen anderen Stoppcode/eine andere Sequenz auswählen. Ich empfehle, den Stoppcode auf 255 zu ändern.

2) Bei der Dekodierung hat a nie

Sie müssen definiert durch ein anderes Mittel, die Länge der Nachricht zu erhalten. Ich schlage vor, dies zu tun mit einem Zähler:

counter = 0 
while something: 
    counter += 1 

# do something with count here 

Alles in allem eine funktionierende Version des Codes würde wie folgt aussehen:

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

Der Unterschied ist da, aber es sind nur ein paar einzelne Pixel. Wenn ich den Unterschied zwischen Original und neuem Bild errechne, sehen Sie es in der Mitte links, gespeichert in test2.png. Um den Kontrast zu erhöhen, habe ich das Bild "entzerrt".

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

Dies ist das Ergebnis: enter image description here

+0

Ich möchte nicht ändern, wie das Bild aussieht, ich möchte einfach eine Nachricht hineincodieren, indem ich die Pixel R in die entsprechenden Zeichen umwandle ASCII Code, damit ich die Nachricht später decodieren kann. Ich könnte Ihren Punkt falsch bekommen, so würde ich mich freuen, wenn Sie mehr erklären könnten –

+0

Mein Punkt ist: Ihr Programm funktioniert. Das von Ihnen gespeicherte Bild unterscheidet sich vom Originalbild. Aber wenn mein zu kodierender Text "Test" ist, modifizierst du nur 4 einzelne Pixel (len (a) = 4), so dass du den Unterschied mit deinem bloßen Auge nicht sehen wirst. Deshalb habe ich das ursprüngliche und das neue Bild subtrahiert, so bleibt nur der Unterschied bestehen. Und da die Differenz gering ist (ord (a [i]) ist ungefähr 60), habe ich die Grauwerte verstärkt, indem ich sie entzerrt habe. – tfv