Bonjour, avec mon ami nous devons faire un programme de stéganographie mais nous somme bloqué l'image en sortie n'est pas codé et affiche une bande blanche sur le côté gauche.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from PIL import Image
from PIL import Image
import os
os.chdir("F:\Programme Python")
 
 
c="Il faut blanchir les champignons! Ou un truc comme ça... dans le genre moisi, quoi"
#on note la longueur de la chaine et on la transforme en binaire
u=len(c)
v=bin(len(c))[2:].rjust(8,"0")
#on transforme la chaine en une liste de 0 et de 1 
ascii=[bin(ord(x))[2:].rjust(8,"0") for x in c]
#transformation de la liste en chaine
a=''.join(ascii)
a = str(a)
print (a)
tba = list(a)
# Je charge l'image a traiter
monImage = Image.open('coupable.png')
 
# Je prend en compte son canal alpha, le pixel contient alors 4 valeurs : RGBA
monImage = monImage.convert ("RGBA")
 
# Je demande la taille de cette image, sa largeur et sa hauteur.
largeur, hauteur = monImage.size
 
# Creation de la nouvelle image vierge aux meme dimensions que l'image de depart
imageFinale = Image.new('RGBA', (largeur, hauteur), 'white');
 
# Je demande la matrice de pixels de l'image originale a steganographier
pixelsOrigine = monImage.load()
 
# Je demande la matrice de pixels de l'image destination qui sera steganographiee
pixels = imageFinale.load()
 
 
for colonne in range(largeur):
 
    # pour chaque ligne d'une colonne choisie sur toute la hauteur
    for ligne in range(hauteur):
 
        # prendre connaissance des composantes rvba d'un pixel de l'image originale
        r, v, b, alpha = monImage.getpixel((colonne,ligne))
 
        # par defaut, j'affecte les valeurs rvba aux pixels de l'image
        # a steganographier. Ces valeurs n'ont pas encore ete modifiees.
        rS = r
        vS = v
        bS = b
        alphaS = alpha
        #Simple traduction en binaire pour ensuite modifier les deux derniers bits
        rB, vB, bB, alphaB = bin(rS)[2:].rjust(8,"0"), bin(vS)[2:].rjust(8,"0"), bin(bS)[2:].rjust(8,"0"), bin(alphaS)[2:].rjust(8,"0")
        #On met sous forme de liste pour pouvoir modifier les deux derniers bits
        tbr, tbv, tbb, tbalpha = list(rB), list(vB), list(bB), list(alphaB)
        #Ici on supprime les deux dernier bits de chaque liste
        tbr.pop(6), tbr.pop(6), tbv.pop(6), tbv.pop(6), tbb.pop(6), tbb.pop(6), tbalpha.pop(6), tbalpha.pop(6)
 
        if len(tba)>0 :
            #On ajoute à la fin de la liste les deux premiers chiffre de notre mot traduit en binaire
            tbr.append(tba[0])
            tbr.append(tba[1])
            tbv.append(tba[2])
            tbv.append(tba[3])
            tbb.append(tba[4])
            tbb.append(tba[5])
            tbalpha.append(tba[6])
            tbalpha.append(tba[7])
            #On supprime les huits premiers chiffres de notre mot traduit en binaire 
            tba.pop(7), tba.pop(6), tba.pop(5), tba.pop(4), tba.pop(3), tba.pop(2), tba.pop(1), tba.pop(0)
 
            rS, vS, bS, alphaS = [int(tbr) for tbr in tbr] ,[int(tbv) for tbv in tbv], [int(tbb) for tbb in tbb] ,[int(tbalpha) for tbalpha in tbalpha]
            #Ça c'est pour transformer les listes en strings puis en entier
            r = int("".join(tbr))
            v= int("".join(tbv))
            b = int("".join(tbb))
            alpha = int("".join(tbalpha))
            #Et ça ça sert a mettre dans le pixel de rang [colonne,ligne] les nouvelles 
            #valeurs de rgba mais apparemment ça  marche pas puisque ça mets tout en blanc
            pixels[colonne, ligne] = (r, v, b, alpha)
print(r,v,b,alpha)
imageFinale.save('imageStegano.png', 'PNG')
Edit : Ajout de commentaire dans le code