[C] Utiliser libjpeg pour du cropping

Résolu
Bonjour,
mon but est de découper une image hd en carrés de 256*256 pixels.
Pour cela j'utilise la libjpeg et les fonctions de jpegtran qui sont dans transupp.c.

Ces fonctions permettent de faire le découpage sans décompresser l'image source et sans compresser l'image de destination donc on gagne du temps.

Mon problème est que je n'arrive pas à réutiliser l'image source : pour que mon code fonctionne il faut que je refasse un fopen(source, "rb") à chaque itération (= création d'un carré).

Est-ce que quelqu'un qui connait la libjpeg pourrait m'aider ?

3 réponses

  1. Contributeur
    Je ne vois pas de boucle dans le code source que tu as donnée.
    Je dirai comme ça, qu'il faut remettre le pointeur de fichier au début avant le nouveau quart d'image.
    1. Voici l'essentiel de mon code :

      /* Déclaration des variables */
          FILE* fin, * fout;
          Uint i, I, j, J;
          Uint X, Y, W, H;
          char* tilename;
          char* zi, * zj;
          struct jpeg_decompress_struct srcinfo;
          struct jpeg_error_mgr srcerr;
          struct jpeg_compress_struct dstinfo;
          struct jpeg_error_mgr dsterr;
          struct jvirt_barray_control** srccoef;
          struct jvirt_barray_control** dstcoef;
          jpeg_transform_info tranopt;
          JCOPY_OPTION copyopt = JCOPYOPT_DEFAULT;
      
      // Paramétrages divers dont je vous fais grâce
      
      /* Préparation de l'image source */
      srcinfo.err = jpeg_std_error(&srcerr);
      jpeg_create_decompress(&srcinfo);
      
      // Lancement des deux boucles imbriquées
      
      /* Suite de la création de la source ; j'aimerai sortir tout ça de la boucle mais si je le fais ça bug */
      fin = fopen(imgpath, "rb");
      jpeg_stdio_src(&srcinfo, fin);
      (void) jpeg_read_header(&srcinfo, TRUE);
      jcopy_markers_setup(&srcinfo, copyopt);
      
      /* Mise au point des paramètres de découpages */
      tranopt = *(JPEG_Create_Transform(TRAN_CROP));
      JPEG_Set_Crop_Rect(&tranopt, X, Y, W, H);
      jtransform_request_workspace(&srcinfo, &tranopt);
      srccoef = jpeg_read_coefficients(&srcinfo);
      
      // Création de l'image destination
      
      // Application des transformations
      
      // Nettoyage et reprise de la boucle
      
      
      1. Je n'avais pas écrit les for() pour rester compact. Effectivement un rewind(fin) résout le problème, merci beaucoup :)