Compression RLE

Compression RLE - C++ - Programmation

Marsh Posté le 22-05-2003 à 17:18:30    

Alors voila je vous donne mon code pour cetet compression pour que puissiez m aider a comrpendre ce qui va pas , car cela marche pour plein de fichier image ( capture d ecran , .. ) mais pas pour certains fixhiers ( type dessin de merde fait sous paint ) SVP aidez moi  
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. FILE *source,*sortie;
  4. unsigned char codeRepet='@';// on definit le caractere @ comme caractere de repetition  
  5. long int nbreRepet=1;
  6. char Caractprec,caract,codeARepeter;
  7. void compress(void);
  8. void dcompress(void);
  9. int main(int argc, char *argv[])//passage d'arguments pour l instant pour tester
  10. {                                             
  11.      char option;
  12.      option = *argv[3];
  13.    
  14.      source = fopen(argv[1],"rb" );
  15.      sortie = fopen(argv[2],"wb" );
  16.    
  17.      if (option == 'c') compress();
  18.      if (option == 'd') dcompress();           
  19.            
  20.      fclose(source);
  21.      fclose(sortie);
  22.        
  23.      return 0;
  24. }
  25. void compress(void)
  26. {
  27. fread(&Caractprec,sizeof(char),1,source);
  28. while (!feof(source))     
  29.          fread(&caract,sizeof(char),1,source);
  30.          if (Caractprec == codeRepet)//si le caractere recupere est le de repetition on le code comme
  31.   {        //si c etait une repetition pour evite d avoir des problemes lors de la decompression
  32.   nbreRepet=1;
  33.   fwrite(&codeRepet,sizeof(char),1,sortie);
  34.   fwrite(&nbreRepet,sizeof(long int),1,sortie);
  35.   fwrite(&codeRepet,sizeof(char),1,sortie);
  36.   Caractprec = caract;
  37.   }
  38.   else
  39.   {
  40.   if (caract==Caractprec)
  41.   {
  42.    nbreRepet++;
  43.    Caractprec=caract;
  44.   }       
  45.   else
  46.   {
  47.    if (nbreRepet>3) //si compression avantageuse on la fait  
  48.    {
  49.     fwrite(&codeRepet,sizeof(char),1,sortie);
  50.     fwrite(&nbreRepet,sizeof(long int),1,sortie);
  51.     fwrite(&Caractprec,sizeof(char),1,sortie);
  52.                 }           
  53.    else //sinon non  
  54.    {
  55.     if (Caractprec != codeRepet)
  56.     {
  57.      for (long int i=0 ; i!=nbreRepet ; i++)
  58.      {
  59.       fwrite(&Caractprec,sizeof(char),1,sortie);
  60.      }
  61.     }
  62.    }
  63.    nbreRepet = 1;
  64.    Caractprec = caract;
  65.   }
  66.   }
  67. }
  68. printf("Compression acheve" );
  69. }
  70. void dcompress()
  71. while (!feof(source))
  72. {
  73.          fread(&caract,sizeof(char),1,source);             
  74.        
  75.          if (caract == codeRepet)//si caractere compresse  
  76.          {
  77.   fread(&nbreRepet,sizeof(long int),1,source);
  78.   fread(&codeARepeter,sizeof(char),1,source);
  79.   for (long int i=0 ; i != nbreRepet ; i++)//on le recopie le nombre de fois necessaire
  80.   {
  81.    fwrite(&codeARepeter,sizeof(char),1,sortie);
  82.   }
  83.          }
  84.          else //cas d'un caractere non compresse  
  85.          {
  86.   fwrite(&caract,sizeof(char),1,sortie);//on le recopie simplement  
  87.          }
  88. }
  89. printf("Decompression acheve" );
  90. }

Reply

Marsh Posté le 22-05-2003 à 17:18:30   

Reply

Marsh Posté le 22-05-2003 à 17:21:00    

les autres je sais pas, mais moi j'aide pas qqun qui me decrit pas le pb, symptome et tout ca

Reply

Marsh Posté le 22-05-2003 à 17:34:35    

ça c'est pas bon
 
while (!feof(source))
    {
               fread(&caract,sizeof(char),1,source);      
 
 
lis la doc de ces deux fonctions et vois qu'il faut controler le retoure de fread et ne pas utiliser feof
 
 
 
question: il se passe quoi si mon ficheir contient un'@' ?

Reply

Marsh Posté le 22-05-2003 à 17:39:50    

si le fichier contient un @ , des que le caractere @ est lu on le traite comme si on devait compresser ce caractere c est a dire cette partie du code  

Code :
  1. if (Caractprec == codeRepet)//si le caractere recupere est le de repetition on le code comme  
  2.   {        //si c etait une repetition pour evite d avoir des problemes lors de la decompression  
  3.   nbreRepet=1;
  4.   fwrite(&codeRepet,sizeof(char),1,sortie);
  5.   fwrite(&nbreRepet,sizeof(long int),1,sortie);
  6.   fwrite(&codeRepet,sizeof(char),1,sortie);
  7.   Caractprec = caract;
  8.   }


 
voila sinon pour le feof c est ce qu on m a enseigne a l'iut donc je pense que vu que c est pour mes projets tuteures , c est bon .

Reply

Marsh Posté le 22-05-2003 à 17:54:05    

[:rv82]

Reply

Marsh Posté le 22-05-2003 à 18:06:08    

Ca sert à quoi de upper? On va pas sortir la boule de cristal pour savoir ce qui ne marche pas... :sarcastic:

Reply

Marsh Posté le 22-05-2003 à 18:21:31    

feof est pas, tes profs se vautre comem des otaries bourées
 
mes données à compresser, c'est ça "d@wa"... ça donen quoi quand tu compresses?

Reply

Marsh Posté le 22-05-2003 à 20:39:23    

d@wa ca donnera d@1@wa , mais la c est pas du tout representatif car il n y a pas de repetition dans ta chaine. pour des chaines comme la tienne on utilise la compression de Huffman. Mais je crosi avoir rtouver la reponse en fait ca merde que lorsque c est un BMP fait avec du remplissage sous paint , sinon fait avec photoshop ca passe nickel.

Reply

Marsh Posté le 23-05-2003 à 07:05:55    

Kabuto a écrit :

d@wa ca donnera d@1@wa , mais la c est pas du tout representatif car il n y a pas de repetition dans ta chaine. pour des chaines comme la tienne on utilise la compression de Huffman. Mais je crosi avoir rtouver la reponse en fait ca merde que lorsque c est un BMP fait avec du remplissage sous paint , sinon fait avec photoshop ca passe nickel.  


Super...à mon avis ca va vachement te permettre de corriger le bug du programme ca... :sarcastic:

Reply

Marsh Posté le 23-05-2003 à 08:59:08    

++Taz t'a donné la réponse : le feof ne fonctionne pas comme tu le crois. :ange:

Reply

Marsh Posté le 23-05-2003 à 08:59:08   

Reply

Marsh Posté le 23-05-2003 à 10:10:31    

non mais le bug ne viens reelement que des fichiers crees sous paint , pour tout autre fichier image cela marche nickel ce qui montre bien que le code fonctionne.

Reply

Marsh Posté le 23-05-2003 à 10:15:05    

Kabuto a écrit :

non mais le bug ne viens reelement que des fichiers crees sous paint , pour tout autre fichier image cela marche nickel ce qui montre bien que le code fonctionne.


 :lol:  
Donc c'est pas ton code qui est buggé de pas marcher avec les fichiers créés par paint, ce sont tous les logiciels existants qui marchent avec ces mêmes fichiers qui devraient pas, c'est ça? :sarcastic:  

Reply

Marsh Posté le 23-05-2003 à 10:58:21    

skeye a écrit :


 :lol:  
Donc c'est pas ton code qui est buggé de pas marcher avec les fichiers créés par paint, ce sont tous les logiciels existants qui marchent avec ces mêmes fichiers qui devraient pas, c'est ça? :sarcastic:  


 
mais c'est bien sur ! [:yaisse2]

Reply

Marsh Posté le 23-05-2003 à 13:11:00    

Cela en marche pas qu avec les fichiers crees sous paint et utilisant du remplissage car paint doit utiliser une compression quelqconque pour le remplissage.

Reply

Marsh Posté le 23-05-2003 à 13:14:02    

Kabuto a écrit :

Cela en marche pas qu avec les fichiers crees sous paint et utilisant du remplissage car paint doit utiliser une compression quelqconque pour le remplissage.  


 
t'as des messages d'erreurs spécifiques ? des fonctions ki retournent pas ce qu'il faudrait ? un segfolt ? etc... ou t'as juste une MsgBox ki te dit "Houla ! ce fichier vient de Paint, j'en veux pas."

Reply

Marsh Posté le 23-05-2003 à 13:36:14    

Kabuto a écrit :

Cela en marche pas qu avec les fichiers crees sous paint et utilisant du remplissage car paint doit utiliser une compression quelqconque pour le remplissage.  


Quoi qu'il arrive ca te donnera tjrs des fichiers respectant le standard utilisé,et les autres applis savent les lire, donc c'est chez toi qu'il y  un bug, c'est tout!
Donne nous plutot l'erreur que tu as au lieu de batailler comme ca!!

Reply

Marsh Posté le 26-05-2003 à 19:49:09    

ben ca me fait pas d erreurs justement , c est juste que uniquement dans le cas cite , eh ben le fichier une fois reconstitue ne fait plus la taille originale et ne peut donc pas etre ouvert , testez vous verrez .

Reply

Marsh Posté le 26-05-2003 à 19:55:16    

Kabuto a écrit :

ben ca me fait pas d erreurs justement , c est juste que uniquement dans le cas cite , eh ben le fichier une fois reconstitue ne fait plus la taille originale et ne peut donc pas etre ouvert , testez vous verrez .  


Dans ce cas ton soft est buggé soit dans un sens soit dans l'autre hein...c pas magique!

Reply

Marsh Posté le 26-05-2003 à 22:05:40    

Ben ca je veux bien l admettre mais dans ce cas la , aidez moi a trouvez d'où cela vient . Merci  :love:

Reply

Marsh Posté le 26-05-2003 à 23:54:14    

Kabuto a écrit :

Ben ca je veux bien l admettre mais dans ce cas la , aidez moi a trouvez d'où cela vient . Merci  :love:  


 
a permier vue : fichier dtc.cpp, ligne 616, il te manque un const dans ton for.

Reply

Marsh Posté le 27-05-2003 à 09:14:50    

Kabuto a écrit :

Ben ca je veux bien l admettre mais dans ce cas la , aidez moi a trouvez d'où cela vient . Merci  :love:  


Le fichier généré est plus gros? plus petit?
Tu as essayé d'ouvrir le fichier original et le fichier généré dans un éditeur de texte? Et le fichier intermédiaire?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed