Compression rle

Soyez le premier à donner votre avis sur cette source.

Vue 20 279 fois - Téléchargée 1 763 fois

Description

Compression de tableau grâce à un algorithme RLE. Il peut servir pour la compression de fichier au format texte.

Source / Exemple :


/********************************************************
	Compression RLE
	
	Thomas Poulichet
	
	Créé le 11/12/02

	Modifié le 24 juin 2003

                                                                                                                  • /
#include <stdio.h> #include "GestionFichier.h" int compressionRLE(char [],char []); void decompressionRLE(char [],int); void diagnostique(int); //# define grandeur 16 /*défini la taille du tableau à compresser*/ void main(void) { //char tab[grandeur]={'a','a','a','a','r','r','r','r','r','r','r','j','j','i','h','h'}; char tabcompresse[NB_CARACTERES_MAX]; int i; int taillecompressei; LectureFichier(); printf("tableau d origine"); /*Affichage tableau d'origine*/ printf("\n"); for (i=0;i<NB_CARACTERES_MAX;i++) { printf("%c",ImageFichier[i]); } printf("\n\n"); taillecompressei = compressionRLE(ImageFichier,tabcompresse); /*Appel de la fonction de compression*/ /*On passe tab et tabcompresse*/ EcritureFichier(tabcompresse,taillecompressei); //decompressionRLE(tabcompresse,taillecompressei); /*Appel de la fonction de décompression*/ diagnostique(taillecompressei); /*Appel de la fonction de diagnostique*/ } /************************************/ /*Compression du tableau*/ int compressionRLE(char tab[],char tabcompresse[]) { int i,nbrepet=1,position=0,j=0; for (i=0;i<NB_CARACTERES_MAX;i++) { nbrepet=1; if (tab[i]==tab[i+1]) /*teste si les valeurs qui se suivent*/ { /*sont identiques*/ while (tab[i]==tab[i+1]) /*compte le nombre de valeurs identiques*/ { /*se suivant*/ nbrepet=nbrepet+1; i++; } /*écrit les données de tabcompresse*/ tabcompresse[position]='$'; tabcompresse[position+1]=(char)nbrepet+'0'; tabcompresse[position+2]=tab[i]; position=position+3; /*positionnement 3 cases aprés sur tabcompresse*/ } else { /*si les valeurs se suivant dans tab ne sont pas identiques*/ tabcompresse[position]=tab[i]; /*écrit la valeur unique dans*/ position=position+1; /* tabcompresse*/ } } printf("tableau compresse\n"); /*Affichage de tabcompresse jusqu'à la dernière*/ for (i=0;i<position;i++) /*case remplie*/ { printf("%c",tabcompresse[i]); } printf("\n\n"); return(position); /*retourne la valeur position et donc la taille*/ /*de tabcompresse au Main*/ } /************************************/ /*Décompression du tableau*/ void decompressionRLE (char tabcompresse[],int position) /*Récupère tabcompresse et sa taille*/ { char tabdecompresse[NB_CARACTERES_MAX],lettre; int i,j=0,k=0,nbrepet; for (i=0;i<position;i++) { if (tabcompresse[i]=='$') /*si la valeur de la case de tabcompresse est '$'*/ { nbrepet=tabcompresse[i+1]-'0'; /*reconnaissance du nombre de lettres à répéter*/ lettre=tabcompresse[i+2]; /*reconnaissance de la lettre à répéter*/ for(j=k;j<k+nbrepet;j++) { tabdecompresse[j]=lettre; /*écriture des lettres dans tabdecompresse*/ } k=k+nbrepet; /*postionnement sur la case suivante de tabdecompresse*/ } else { if (tabcompresse[i-1]!='$') /*teste si la valeur de la case précédente est '$'*/ { if(tabcompresse[i-2]!='$') /*teste si la valeur de 2 cases avant est '$'*/ { nbrepet=1; /*Si NON, alors le nombre de lettre à répéter est 1*/ lettre=tabcompresse[i]; for(j=k;j<k+nbrepet;j++) { tabdecompresse[j]=lettre; /*écriture de la lettre dans tabdecompresse*/ } k=k+nbrepet; /*postionnement sur la case suivante de tabdecompresse*/ } } } } printf("tableau decompresse\n"); for(i=0;i<k;i++) /*Affichage du tableau tabdecompresse jusqu'à grandeur*/ { printf("%c",tabdecompresse[i]); } printf("\n\n"); } /************************************/ /*Diagnostique de compression*/ void diagnostique (int taillecompresse) { float taillecompresse2, temp; /*Calcul le taux de compression en pourcentage*/ char prcent='%'; taillecompresse2=(float)taillecompresse*100/NB_CARACTERES_MAX; temp=100-taillecompresse2; printf("La taille compresse est:%d et la taille d origine est:%d\n\n",taillecompresse,NB_CARACTERES_MAX); printf("la compression est de %.1f %c \n\n",temp,prcent); /*Affiche le taux de compression*/ }

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1491
Date d'inscription
dimanche 19 novembre 2000
Statut
Modérateur
Dernière intervention
7 juillet 2014

Sa va même avoir l'effet contraire sur un fichier texte puisque les répétition sont presques inexistantes et encore c'est 2 lettres consécutives. LZW et Huffman sa fait bien mieux, huffman avec un dictionnaire fixe serait peut-être envisageable puisqu'une bonne partie des caractères ASCII ne seront même pas utilisé pour du texte normal.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
la compression RLE est valable sur des fichiers de type bitmap mais ne donne pas grand chose sur du texte car la frequence de repetition des octets est trop faible.

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.