[C] Utiliser libjpeg pour du cropping

Résolu/Fermé
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 11 juil. 2012 à 12:06
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 11 juil. 2012 à 15:52
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 ?
A voir également:

3 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
11 juil. 2012 à 14:46
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
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
11 juil. 2012 à 12:14
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

0
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
11 juil. 2012 à 15:52
Je n'avais pas écrit les for() pour rester compact. Effectivement un rewind(fin) résout le problème, merci beaucoup :)
0