CHAPITRE III : L'ELABORATION D'UN ALGORITHME DE
MARQUAGE DE TEXTE AU SEIN D'UNE IMAGE
BITMAP
III.1 LE MESSAGE A CODER
Dans le chapitre premier nous avons expliqué que les
octets de l'image bitmap peuvent être codés en binaire, et dans le
chapitre précédent nous venons de montrer comment le message en
vue d'être camouflé derrière une image doit être
converti en binaire, étant donné que l'image est constitué
des pixels codés sur des octets et octets composés des bits.
De ce fait, le message ne laissera plus voir une distinction
de ses caractères qu'une suite des bits car, même les espaces
seront eux aussi convertis en binaire. Il suffit de découper le message
caractère par caractères et mettre ceux-ci dans un tableau des
entiers dont la taille doit être supérieur ou égale au
nombre des pixels de l'image.
La méthode suivante nous aidera à faire
cela :
static int[] messageAcoder(){
char[] t=new char[multiplicateur];
int[] Tableaumess=new int[multiplicateur];
for(int p=0;p<multiplicateur;p++){
t[p]=phrase.charAt(p);
Tableaumess[p]=(int)t[p];
}
return Tableaumess;
}
Le tableau qui est retourné ici, renvoi le code ASCII
de chaque caractère les espaces inclus.
Pour bien illustrer cette méthode, Prenons l'exemple
d'un petit message comme « Est tu là? Non» le tableau qui
sera retourné quand l'utilisateur entre un tel message contiendra les
nombres correspondants au code ASCII des caractères suivants:
32
|
69
|
115
|
116
|
32
|
116
|
117
|
32
|
108
|
224
|
63
|
32
|
78
|
111
|
110
|
(Tableau 4)
III. 2 LECTURE DE L'IMAGE
Tenons à signaler que l'image contenant
déjà le message sera généralement envoyé en
destination, il sera important pour nous de prévoir deux fichiers du
format BMP : l'un, « Image de départ »
contenant une image dont le contenu sera utilisé, et lu uniquement puis
sera transporté dans trois tableaux de notre logiciel ; c'est
à partir de ce logiciel que nous insérerons le message dans ces
tableaux avant de les copier dans une autre image appelée
« Image de destination » qui peut avoir des données
primitives.
NB : a défaut de la deuxième image,
celle-ci sera crée dès que l'on entrera un nom quelconque.
L'image appelée de destination contiendra
immédiatement le contenu de la première additionnée du
message.
La méthode suivante nous a servie de lire le fichier
« Image de départ »:
public static void lireImage(String adresseImage){
entete=new int[16];
tabEntete=new int[28];
int[] matrisse=new int[multiplicateur*3];
int compteur=0;
try{
FileInputStream con=new FileInputStream(adresseImage);
BufferedInputStream fid=new BufferedInputStream(con);
DataInputStream dan=new DataInputStream(fid);
int a=dan.read();int b=dan.read();
if(a!=66||b!=77)
System.out.println("le fichier "+adresseImage+" ne
contient pas une image bitmap");
for(int i=0;i<16;i++)entete[i]=dan.read();
a1=dan.read();b1=dan.read();c1=dan.read();d1=dan.read();
a2=dan.read();b2=dan.read();c2=dan.read();d2=dan.read();
largeur=a1+256*(b1+256*(c1+256*d1));
hauteur=a2+256*(b2+256*(c2+256*d2));
System.out.println("la largeur est"+largeur);
System.out.println("la hauteur est"+hauteur);
prOctet=new int[hauteur][largeur];
dxOctet=new int[hauteur][largeur];
trsOctet=new int[hauteur][largeur];
complement=largeur%4;
System.out.println("le complement par ligne est de
"+largeur+" octets");
multiplicateur=hauteur*largeur;
System.out.println("Cette image permet le
marquage de "+multiplicateur+" caracteres, les espaces
inclus");
javax.swing.JOptionPane.showMessageDialog(null,"VOUS DEVEZ ENTRER UN MESSAGE
D'AU
MOINS "+multiplicateur+" CARACTERES
INCLUS LES ESPACES VIDES");
for(int i=0;i<28;i++)tabEntete[i]=dan.read();
matrix=new int [multiplicateur*3];
for (int i=hauteur-1; i>=0; i--){
for(int j=0; j<largeur; j++){
prOctet[i][j]=dan.read(); dxOctet[i][j]=dan.read();
trsOctet[i][j]=dan.read();
matrix[compteur]=prOctet[i][j];compteur++;
matrix[compteur]=dxOctet[i][j];compteur++;
matrix[compteur]=trsOctet[i][j];compteur++;
}
for(int j=0; j<complement; j++) dan.read();
}
dan.close();
}catch(IOException e) {
System.out.println("Erreur dansla lecture de l'image");
}
}
Ce sont les tableaux prOctet[i][j],dxOctet[i][j] et
trsOctet[i][j] qui contiennent les données relatives a l'image Initiale.
Ceux-ci doivent contenir des entiers car les octets lus de l'image ont des
valeurs entières.
Etant donné que le message à été
traduit en une suite des valeurs entières et que les données lues
de l'image sont entières, pourtant le camouflage doit se passer bit par
bit, nous nous trouvons n'est-ce pas devant un problème ? Il nous
faut donc travailler avec des nombres binaires. Le point suivant traitera
comment résoudre ce problème.
|