Decompression JPEG

aziatedu13 Messages postés 19 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 20 février 2008 - 7 nov. 2007 à 11:17
Abrahamz Messages postés 14 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 9 décembre 2008 - 15 nov. 2007 à 13:28
bonjour,

Je cherche a faire une fonction de décompression en Jpeg to BMP.
J'ai pris quelque exemple masi un problème me bloque.
voici tout d'abord ma fonction :
int deconvjpeg(char * filename)
{


 /* This struct contains the JPEG decompression parameters and pointers to
   * working space (which is allocated as needed by the JPEG library).
   */
  struct jpeg_decompress_struct cinfo;
  /* We use our private extension JPEG error handler.
   * Note that this struct must live as long as the main JPEG parameter
   * struct, to avoid dangling-pointer problems.
   */
  struct my_error_mgr jerr;
  FILE * infile;                /* source file */
  JSAMPARRAY buffer;            /* Output row buffer */
  int row_stride;               /* physical row width in output buffer */


 if ((infile fopen(filename, "rb")) NULL) {
    fprintf(stderr, "can't open %s\n", filename);
    return 0;
  }


 cinfo.err = jpeg_std_error(&jerr.pub);
  jerr.pub.error_exit = my_error_exit;
  if (setjmp(jerr.setjmp_buffer)) {

    jpeg_destroy_decompress(&cinfo);
    fclose(infile);
    return 0;
  }
  jpeg_create_decompress(&cinfo);
 jpeg_stdio_src(&cinfo, infile);


)
 jpeg_read_header(&cinfo, TRUE);


(void) jpeg_start_decompress(&cinfo);

   row_stride = cinfo.output_width * cinfo.output_components;
   buffer = (*cinfo.mem->alloc_sarray)
                ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);




  while (cinfo.output_scanline < cinfo.output_height) {

    (void) jpeg_read_scanlines(&cinfo, buffer, 1);
  put_scanline_someplace(buffer[0], row_stride);  // ne reconnai pas cete fonction, et juste celle la.
  }


) jpeg_finish_decompress(&cinfo);


  jpeg_destroy_decompress(&cinfo);




  fclose(infile);




  return 1;
}

la fonction put_scanline_someplace est inconnu, donc probleme de définition...
je pensai que cette fonction était avec tout les autre concernat jpeg_decompresse etc...
comment pourrai je avoir cete fonction et ou l'intégrer ???
Merci.

nouveau developpeur, dans le cadre de ses étude.

3 réponses

Abrahamz Messages postés 14 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 9 décembre 2008
11 nov. 2007 à 17:45
Tu as du copier ce bout de code sur un site (peut être le même que celui que j'ai trouvé).
/* Assume put_scanline_someplace wants a pointer and sample count. */
put_scanline_someplace(buffer[0], row_stride);

Il faut que tu écrives toi même cette fonction, c'est la fonction de sortie de l'algorithme (on te fourni le décodage, à toi du l'utiliser).

Tu peux essayer un truc comme ça :

(à mettre en début de fichier)
#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif

Puis :
void put_scanline_someplace(buffer[0], row_stride){
bmpfile = fopen("test.bmp", "w+");
fprintf(buffer[0]);
// Faut peut etre ajouter un retour à la ligne
// Ou encore ecrire caractère par caractère (la ligne fait row_stride caractères)
}
0
aziatedu13 Messages postés 19 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 20 février 2008
12 nov. 2007 à 16:51
alors,
j'ai essayer ceci,

//bmp est un descripteur de fichier ouvert par fopen("decompressedbmp.bmp","w");
et fermer apres la boucle par fclose(bmp);
void put_scanline_someplace(FILE * fbmp,(char*)buffer, int row_stride){

fwrite(buffer,row_stride,1,fp); //je pense que bufer contient les information d'une ligne, donc je lai ecrit, d'ou la taille row_stride et ceci une seule fois, d'ou le 1
// fwrite("\n",sizeof(char),1,fp); //test pour retour a la ligne a chak boucle, masi aucun résultat non plus
}

je ne pense pas qu'il fasse ecrire caractere par caractere, car la boucle dans laquel est put_scanline_someplace est une boucle de la taille de la lalrgeur de l'image, donc je pense que c'est bien ligne par ligne qu'il faut écrire.

le fhcier de sortie a la bonne taille que le bmp d'origine, masi n'est pas lisible. ==>blockage...
Merci de votre attention.

nouveau developpeur, dans le cadre de ses étude.
0
Abrahamz Messages postés 14 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 9 décembre 2008
15 nov. 2007 à 13:28
Tu peux essayer d'ouvrir ton fichier bmp original et le nouveau fichier bmp avec un éditeur hexadécimal, pour voir où ils diffèrent. A mon avis il faut que tu rajoute les headers en début de fichier bmp (C'est quelques caractère qui indiquent que les caractères suivant représentent une image 32 bits, de telle taille, suivant tel encodage.. Enfin tu verras bien la différence qui fait que ca marche pas en utilisant un editeur hexadecimal (je connais freeHex qui fait ça bien).

a+
0
Rejoignez-nous