Decompression JPEG

Signaler
Messages postés
19
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
20 février 2008
-
Messages postés
14
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
9 décembre 2008
-
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

Messages postés
14
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
9 décembre 2008

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)
}
Messages postés
19
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
20 février 2008

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.
Messages postés
14
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
9 décembre 2008

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+