Decaler l'encodage d'un bmp

Soyez le premier à donner votre avis sur cette source.

Vue 5 159 fois - Téléchargée 420 fois

Description

On ouvre une fichier BMP 24 bits avec une classe coder par Kirua qui m'a genereusement offert lol. Et avec une classe DecalBit Apres avoir lu le header et mis le codage des pixels dans un tableau decaler les bits un a un a gauche ou a droite de N bit.
<<
>>
Nous ne fesons pas que decaler nous recuperons les bits de poids faible pour les remettres de l'autre coter sinon nous aurons une perte de donner et impossible de recuperer les informations de bases :

Source / Exemple :


// Exemple de decalage de bit a droite avec un octet c et du k:
    f = c & ((1 << k) - 1); // Nous recuperons les bits de poids faibles
    c >>= k; // Decalons l'octet de k
    f <<= (8 - k); // Decalons le bit de poids faible de l'autre coté
    c |= f; // Et avec un ou l'ogique nous "melangons" les 2

Conclusion :


Exemple avec l'octet :
1001 1010
Decalage de 2 a droites
Explication
Un decalage a gauche est une multiplication donc 1 << k equivaut a 2^k
1 << k = 0000 0100
(1 << k) - 1 = 0000 0011
Alors le bit de poids faible est :
1001 1010 = c
& 0000 0011 = ((1 << k) - 1)
___________
0000 0010 = f

Decalons notre octet de base a droite de 2
1001 1010 >> 2 = 0010 0110 = c
f <<= (8 - k) <=> f <<= (8 - 2) <=> f <<= 6
f <<= 6 <=> f = 1000 0000
0010 0110
| 1000 0000
___________
1010 0110

Voilà notre bit decaler :p

Codes Sources

A voir également

Ajouter un commentaire Commentaires
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
7 juin 2005 à 09:45
Amusant comme source :-)
par contre il y a kkes problèmes dans Decal_bit.cpp :
CDecal_bit::dbit :
if(s = 1) // toujours vrai, c'est pas un test ^__^
faute de frappe ?

paramètre (unsigned char& c...
tu passes une référence, donc si on modifie c, on modifie la source, tu devrais sois mettre (const unsigned char& c...
sois ne pas retourner de valeur et modifier c

en fait tu fais de la rotation de bits sur des octets
si je puis me permettre, tu aurais pu faire une seule fonction pour la rotation :

// Decalage en fonction de s (s = 1 a droite sinon a gauche)
unsigned char CDecal_bit::dbit(const unsigned char &c, bool s, int k)
{
k %= 8; // k doit être compris entre 0 et 7 inclus (me suis pas trompé là ;p)
if(s 0) // rotation à gauche rotation à droite de 8 - k
k = 8 - k;
return dbitd(c, k);
}

// Decalage bit droite
unsigned char CDecal_bit::dbitd(const unsigned char &c, int k = 1)
{
return (c >> k) | (c << (8 - k));
}
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
7 juin 2005 à 09:50
j'oublie un truc, les décalages de bits négatifs c'est pas terrible, k devrait plutot être unsigned je pense
cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009
7 juin 2005 à 14:41
Une question : ça sert à quoi ???
hackademius Messages postés 172 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 24 février 2008
7 juin 2005 à 16:20
oaui , bonne question , ca sert a quoi ? de decaler les bits ? ca coupe en 2 la photo et met la partie de droite a gauche ? ou koi ?
hackademius Messages postés 172 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 24 février 2008
7 juin 2005 à 16:22
ou alors a brouiller la photo pour que l'on ne la reconnaisse plus ? peut etre

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.