voici 2 procedures qui font cela
le principe utilisé ici est le suivant :
on prends une image Bmp
on prends chaque caractere du texte a encoder
un caractere = 8 bits
chacun des 8 bits du caractere est envoyé dans le dernier bit de droite de la composante rouge d'un pixel !
il faut donc 8 pixels pour encoder 1 caractere ... donc un huitieme de l'image est pris pour encoder un texte
si je ne me plante pas dans mes calculs ...
une image de 1920*1080 (fullHD) represente 2073600 pixels ce qui divisé par 8 donne 259 200 caracteres possible par image
ça laisse de la marge
voici le code :
Code : Tout sélectionner
;***********************************************
;Titre :steganosorus
;Auteur : Dobro
;Date :30/06/2019
;Heure :17:01:40
;Version Purebasic : PureBasic 5.20 LTS (Windows - x86)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune
;***********************************************
; encode/decode une image Bmp
Declare.s decode_steganosorus(name_image.s)
Declare encode_steganosorus(name_image.s,message.s)
Enumeration
#Image
EndEnumeration
; ************** encodage d'un message dans l'image *************
name_image.s=GetCurrentDirectory()+"testcrypte2.bmp"
message.s="il est beau mon lavabo !"+chr(10)+"et Tiens pendant qu'on y est, une deuxieme phrase"+chr(10)+"pour voir ...."
encode_steganosorus(name_image.s,message.s)
; ***********************************************************
CallDebugger
; *********** decodage du message dans l'image ************************
name_image.s=GetCurrentDirectory()+"testcrypte2.bmp"
message.s= decode_steganosorus(name_image.s)
MessageRequester("resultat", "Le message est :"+chr(10)+message.s)
; ***************************************************************
;-zone Procedures
Procedure.s decode_steganosorus(name_image.s)
LoadImage(#image,name_image.s)
largeur=ImageWidth(#Image)
hauteur=ImageHeight(#image)
StartDrawing(ImageOutput(#image))
; By Dobro
;decodeur
longueur= point(largeur-1,hauteur-1) ; la longueur du message se trouve dans le dernier point de l'image
For y=0 to hauteur-1
For x=0 to largeur-1 step 8
octet$=""
for i=0 to 7
coul=point(x+i,y)
rouge=red(coul)
; ici je ne me sert pas des composante verte et bleu
;vert=green(coul)
;bleu=blue(coul)
bit$=bin(rouge,#PB_Ascii )
bit$=RSet(bit$,8,"0")
octet$=octet$+right(bit$,1)
next i
car=val("%"+octet$)
l$=l$+chr(car)
Next x
Next y
ProcedureReturn left(L$,longueur)
StopDrawing()
EndProcedure
;
Procedure encode_steganosorus(name_image.s,message.s)
; By Dobro
; encodeur
LoadImage(#image,name_image.s)
largeur=ImageWidth(#Image)
hauteur=ImageHeight(#image)
StartDrawing(ImageOutput(#image))
compteur_pos=1
; on encodera la longueur du text dans le dernier point de l'image
longueur=len(message.s)
For y=0 to hauteur-1
For x=0 to largeur-1 step 8
octet$=""
lettre.s=mid(message.s,compteur_pos,1)
Letter=asc(lettre.s)
octet_lettre.s=bin(letter,#PB_Ascii)
octet_lettre.s=RSet(octet_lettre.s,8,"0")
if compteur_pos<=longueur
For i=0 to 7 ; paquet de 8 bits pour encoder 1 lettre
coul=point(x+i,y)
rouge=red(coul)
vert=green(coul)
bleu=blue(coul)
octet_rouge$=bin(rouge,#PB_Ascii )
octet_rouge$=RSet(octet_rouge$,8,"0")
bit$=mid(octet_lettre.s,i+1,1); prend l'extrait du bit de la lettre
if bit$<>""
octet_rouge_ap$=left(octet_rouge$,len(octet_rouge$)-1)+bit$ ; le colle a la fin de l'octet rouge en cours
Endif
plot(x+i,y,rgb(val("%"+octet_rouge_ap$),vert,bleu))
next i
compteur_pos=compteur_pos+1
Else
coul=point(x,y)
rouge=red(coul)
vert=green(coul)
bleu=blue(coul)
plot(x,y,rgb(rouge,vert,bleu))
Endif
Next x
Next y
plot(largeur-1,hauteur-1,longueur) ; on pose la longueur du message dans le dernier point de l'image
StopDrawing()
SaveImage(#image,name_image.s)
EndProcedure
; Epb
en faisant de meme avec la composante verte et bleu , on pourrai facilement multiplier par 3 le nombre de caracteres possible
vu qu'ici je n'utilise QUE la composante rouge ...
ps: la taille du text est la valeur RGB du dernier pixel de l'image