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
|
typedef struct
{
char * bleu;
char * rouge;
char * vert;
}
t_pixel;
typedef struct
{
t_pixel image[12];
}
t_GroupeImages;
//pré: c pointe sur un octet et x == 0 ou x == 1
//post: x est inchangé et le bit de poids faible de *c est mis à x, les autres bits de *c sont inchangés.
void lsb(char* c, char x)
{
if(x == 1) *c = *c | x;
else *c = *c & 0xFE;
}
//pré: tabImage contient un tableau de pixel de 12 pixel et i est un entier.
//post: tabImage contient des pixels modifié et int est inchangés
//résultat: les bit de int sont inserer dans le lsb des pixel de tabImage
void modification( t_GroupeImages monTableau,
/* Ca marche... mais étant donné qu'un paramètre est recopié depuis la variable passée, tu comprendras qu'il est plus pratique de passer par un pointeur.
En effet, recopier une adresse (même d'une structure) ira plus vite que recopier la structure elle-même
Toutefois c'est pas primordial de piger ça de suite... */
int i)
{
char tabBit[32]; int cpt; int modulo=1;
for(cpt=0;cpt<32;cpt++)
{
tabBit[cpt] = (i & modulo); //on stock les bits dans un tableau (32 bit == 32 case)
//modulo *= 2; //modulo 1..2..4..8..
modulo <<= 2;
}
int cptP; //compteur des pointeurs par pixel
cpt=0;
while(cpt<12)
{
char * couleur = monTableau[cpt].image.rouge;
char * (couleur+1) = monTableau[cpt].image.vert;
char * (couleur+2) = monTableau[cpt].image.bleu;
/* Là c'est pas bon. C'est comme si t'avais écrit
int i=123;
int(i+1)=512;
Tu peux pas créer de variable nommée "(couleur+1)" quoi... */
cpt++;
for(cptP=0;cptP<3;cptP++)
{
color = *(couleur+cptP);
lsb(color,tabBit[cpt]);
}
}
} |
Partager