Vous êtes sur la page 1sur 2

Programmation Orienté Objet 2

L3 Informatique - S5 Printemps 2012


Travaux Dirigés

TD3

Exercice 1 : Compression d’image


La méthode de compression RLE (Run Length Encoding, parfois notée RLC pour Run Length
Coding) est utilisée par de nombreux formats d’images (BMP, PCX, TIFF). Elle est basée sur
la répétition d’éléments consécutifs.

Le principe consiste à coder un premier élément donnant le nombre de répétitions d’une valeur
puis le compléter par la valeur à répéter.
Par exemple, la chaîne « AAAAAHHHHHHHHHHHHHH »compressée donne « 5A14H ». Le gain
de compression est ainsi de (19-5)/19 soit environ 73,7%.
En revanche, pour la chaîne « REELLEMENT », dans lequel la redondance des caractères est
faible, le résultat de la compression donne « 1R2E2L1E1M1E1N1T » ; la compression s’avère ici
très coûteuse, avec un gain négatif valant (10-16)/10 soit -60% !

En réalité, la compression RLE est régie par des règles particulières permettant de compresser
lorsque cela est nécessaire et de laisser la chaîne telle quelle lorsque la compression induit un
gaspillage.
Ces règles sont les suivantes :
– lorsque trois éléments ou plus se répètent consécutivement alors la méthode de compression
RLE est utilisée ;
– sinon un caractère de contrôle est inséré, suivi du nombre d’éléments de la chaîne non
compressée puis de cette dernière.

Ainsi la compression RLE n’a de sens que pour les données possédant de nombreux éléments
consécutifs redondants, notamment les images possédant de large parties uniformes. Cette mé-
thode a toutefois l’avantage d’être peu difficile à mettre en œuvre.

Figure 1 – Exemple de Grille 4 × 4.

1
Nous considèrerons, pour simplifier, que l’image est codée sous la forme d’une chaîne de carac-
tères, où chaque paquet de 6 caractères représente la couleur d’un pixel en notation hexadécimale.
Par exemple, le paquet "ff008a" représente un pixel dont la composante rouge est (f f )16 (soit
255), la composante verte (00)16 (soit 0), et la composante bleue (8a)16 (soit 138). Une image de
n pixels sera donc représentée par une chaîne de 6n caractères. Par exemple, l’image de la figure 1
serait codée "ffffffffffffffffff000000000000000000000000ffffff000000ffffff000000ffffffffffffffffffffffffffffff"

L’objectif est d’écrire une méthode permettant de compresser et de décompresser une telle image.
Pour cela, nous proposons le codage suivant :
– Si le même pixel se répète 3 fois ou plus, on utilisera deux octets de contrôle o1 o2 : le bit
de poids fort de o1 est à 1, et les 15 autres bits servent à coder le nombre de répétitions du
pixel. Ces deux octets de contrôle sont ensuite suivis de la couleur répétée. Par exemple, si
4 pixels blancs se suivent, cette suite sera codée (en notation hexadécimale) par la chaîne
"8004ffffff".
– Si on a une suite de pixels différents (ou qui ne se répètent pas plus de 2 fois), on fera
précéder cette suite de deux octets de contrôle o1 o2 , où le bit de poids fort de o1 est à
0, et les 15 autres bits servent à coder la taille de la suite. Par exemple, si on a un pixel
blanc, puis un pixel noir, cette suite sera codée (en notation hexadécimale) par la chaine
"0002ffffff000000".

Ainsi, l’exemple d’image de la figure 1 serait compressée en


"8003ffffff80040000000004ffffff000000ffffff0000008005ffffff", soit un gain de (96-58)/96, soit envi-
ron 40%.

Exercice 2 : Les huit Reines


Le problème des huit reines est un exercice classique d’algorithmie : il faut placer huit reines
sur un échiquier de façon qu’elles ne puissent pas se prendre entre elles (il ne doit donc pas
y avoir plus d’une reine par ligne, par colonne ou par diagonale). Notre objectif est de trouver
toutes les configurations possibles. Ce problème constitue un exemple de recherche arborescente.

On pourra créer une classe Echec et stocker les positions de chacune des huit reines dans un
tableau d’entier pos. Pour les valeurs successives de i, on place une reine sur la ligne i et sur une
colonne j = pos[i] en vérifiant qu’elle n’est pas prise et ne peut être prise par les reines déjà en
place.

Nous pourrons utiliser notamment les méthodes suivantes :


– boolean Conflit(int i1, int j1, int i2, int j2) : pour vérifier si 2 deux reines en
position [i1, j1] et [i2, j2] sont en conflit,
– boolean CoupPossible(int i, int j) : pour vérifier si on peut placer la ième reine en
position [i,j],
– void Reine() : pour afficher toutes les solutions.