Compression RLE
Petite intro au RLE (Run-Leng Encoding)

La compression RLE est surtout utilisée dans les fichiers de type PCX, car cet algorithme est efficace lorsque un fichier comporte de nombreuses suites d'octets identiques mais en revanche si un fichier ne comporte pas ou très peu de répétitions, la compression RLE n'est pas efficace (elle peut même alors augmenter la taille du fichier).

Algorithme

En premier lieu, on va se pencher sur la décompression c'est plus simple pour comprendre le RLE

Le programme lit un octet :

-Si la valeur est comprise entre 192 et 255, on soustrait 192 pour avoir le nombre de fois qu'il faudra répéter l'octet suivant (exemple : valeur 205 -> 205-192=13 donc l'octet suivant sera répété 13 fois).
-Si la valeur est inférieure a 192 alors l'octet est laissé inchangé.

Exemple :

Données après compression : 199,55,193,25,198,152...
199 - 192 = 7 donc 7 fois 55
193-192 = 1 donc 1 fois 25
198-192 = 6 donc 6 fois 152
Données après décompression : 55,55,55,55,55,55,55,25,152,152,152,152,152...

Le programme (en QBasic)

REM ---- Déclarations et initialisations des variables ----
DIM car0 AS STRING * 1
DIM car AS STRING * 1
DIM carold AS STRING * 1

Pos1 = 0
Pos2 = 1
cmpt = 0

REM ---- Entrer du nom du fichier ainsi que le fonction (compression ou décompression) ----
INPUT "Fichier a traiter : ", file$
INPUT "Fonction : ", fonction

REM ---- Ouverture des fichiers ----
OPEN file$ FOR BINARY AS #1
OPEN "file.tmp" FOR BINARY AS #2

REM ---- Aller a 'decompression' si demandé ----
IF fonction = 2 THEN
  GOTO decompactage
END IF

REM ---- Algorithme de compression ----
PRINT "Compression en cours..."

REM ---- Lecture du premier octet ----
valcar0 = 300
Pos1 = Pos1 + 1
GET #1, Pos1, car

ValCar = ASC(car)
valcar0 = ValCar
carold = car

REM ---- Boucle de compression ----
DO

  REM ---- Lecture d'un octet ----
  Pos1 = Pos1 + 1
  GET #1, Pos1, car
  ValCar = ASC(car)

  REM ---- Vérification si il y a répétition ou si le compteur a sa valeur maximale (255) ----
  IF ValCar = valcar0 AND cmpt < 63 THEN
    cmpt = cmpt + 1
    REM ---- Fin de répétition ou dépassement du compteur ----
  ELSE
    tmp = cmpt + 192
    car0 = CHR$(tmp)
    PUT #2, Pos2, car0
    PUT #2, Pos2 + 1, carold
    Pos2 = Pos2 + 2
    cmpt = 0
  END IF

  valcar0 = ValCar
  carold = car

  REM ---- On recommence jusqu'à la fin du fichier ----
LOOP UNTIL (EOF(1))
GOTO fin

REM ---- Algorithme de décompression ----
decompactage:
PRINT "Décompression en cours..."

REM ---- Lecture du premier octet
Pos1 = Pos1 + 1
GET #1, Pos1, car

REM ---- Boucle de décompression
DO
  ValCar = ASC(car)

  REM ---- Vérification si la valeur de l'octet n'est pas supérieure ou égale a 192 (répétition si supérieure) ----
  IF ValCar >= 192 THEN
    cmpt = ValCar - 192
    GET #1, Pos1 + 1, car0
    Pos1 = Pos1 + 1
    FOR i = 0 TO cmpt
      PUT #2, Pos2, car0
      Pos2 = Pos2 + 1
    NEXT i
    REM ---- Sinon on l'inscrit simplement ----
  ELSE
    PUT #2, Pos2, car
    Pos2 = Pos2 + 1
  END IF

  Pos1 = Pos1 + 1
  GET #1, Pos1, car

  REM ---- On recommence jusqu'à la fin du fichier ----
LOOP UNTIL (EOF(1))

REM ---- Fermeture des fichiers ----
fin:
CLOSE
CLOSE

REM ---- On remplace le fichier original par le fichier temporaire ----
KILL file$
NAME "file.tmp" AS file$


Remarque

Comme l'algorithme RLE peut augmenter la taille du fichier (si le fichier ne comporte pas ou peu de répétitions), je vous conseille de verifier la taille du fichier après la compression, si la taille a augmenté alors il faut utiliser un autre algorithme de compression plus efficace.


Tutoriaux - Compression RLE - Photographies, projects informatiques et tutoriaux de programmation.
Chandelier Japonais - Annonce immobilière maison - Sellette occasion - Logiciel de rendez-vous - Velo route occasion - Chat sans inscription - Masque - Pic petrolier