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