Compression rle

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

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.