IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Creation image JPEG


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut Creation image JPEG
    Bonjour à tous,

    Très mauvais en langage c, j'essaye de créer une image jpg à l'aide de la librairie libjpeg

    Je crée un tableau de "nblig" lignes et "nbcol*3" colonnes, pourquoi "nbcol*3" ? Car je range les valeurs de R, de G et de B à la suite on a donc 3 fois plus de colonnes que l'image que l'on souhaite obtenir.
    Ensuite j'essaye d'utiliser libjpeg pour configurer et créer mon image jpeg.

    Je n'ai aucun problème à compiler, mais lorsque je lance mon programme, j'obtiens l'erreur suivante :

    Empty JPEG image (DNL not supported)
    voici mon code (attention ça risque de vous piquer les yeux) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <jpeglib.h>
     
     
    int main(void)
    {
    unsigned char R[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,247,243,239,235,231,227,223,219,215,211,207,203,199,195,191,187,183,179,175,171,167,163,159,155,151,147,143,139,135,131,128,};
    unsigned char G[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,247,243,239,235,231,227,223,219,215,211,207,203,199,195,191,187,183,179,175,171,167,163,159,155,151,147,143,139,135,131,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};   
    unsigned char B[]={131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,247,243,239,235,231,227,223,219,215,211,207,203,199,195,191,187,183,179,175,171,167,163,159,155,151,147,143,139,135,131,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
    unsigned char **mat;
    int i=0, j=0, nblig=256, nbcol=256;
     
     
    mat=malloc(nblig*sizeof(unsigned char*));
    if (mat==NULL)
       {
       printf("erreur lors de l'allocation memoire de : mat\n");
       free(mat);
       mat=NULL;
       exit(EXIT_FAILURE);   
       }
    else
       {
       for (i=0;i<nblig;i++)
          {
          mat[i]=malloc((nbcol*3)*sizeof(unsigned char*));
          if (mat[i]==NULL)
             {
             printf("erreur lors de l'allocation memoire de : mat[i]\n");
             for (j=0;j<i;j++)
                {
                free(mat[j]);
                mat[j]=NULL;
                }
             free(mat);
             mat=NULL;
             exit(EXIT_FAILURE);         
             }      
          }
       }
     
    for (i=0;i<nblig;i++)
       {
       for (j=0;j<(nbcol*3);j=j+3)
          {
          mat[i][j]=R[i];
          mat[i][j+1]=G[i];
          mat[i][j+2]=B[i];
          }
       }
     
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr       jerr;
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
     
    cinfo.image_width      = nblig;
    cinfo.image_height     = nbcol;
    cinfo.input_components = 3;
    cinfo.in_color_space   = JCS_RGB;
     
    FILE * outfile;
    outfile = fopen("/home/flaherty/Bureau/hauteur_panache/test.jpeg", "wb");
    if (outfile == NULL) {
       printf("can't open /home/flaherty/Bureau/hauteur_panache/test.jpeg\n");
       exit(1);
       }
    jpeg_stdio_dest(&cinfo, outfile);
     
     
    jpeg_start_compress(&cinfo, TRUE);
     
    JSAMPROW row_pointer[1];      /
    int row_stride;              
    row_stride = nbcol * 3;   
    while (cinfo.next_scanline < cinfo.image_height) {
       row_pointer[0] = mat[cinfo.next_scanline * row_stride];
       jpeg_write_scanlines(&cinfo, row_pointer, 1);
       }
     
    jpeg_finish_compress(&cinfo);
     
     
    }
    Une idée sur ce qui coince ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Lorsqu'on observe le code de libjpeg, on s'apperçoit que cette erreur n'est déclenchée à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      /* Sanity check on image dimensions */
      if (cinfo->image_height <= 0 || cinfo->image_width <= 0 || 
          cinfo->num_components <= 0 || cinfo->input_components <= 0)
        ERREXIT(cinfo, JERR_EMPTY_IMAGE);
    Un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jpeg_set_defaults(&cinfo);
    peut résoudre ton problème.

    A mettre après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jpeg_create_compress(&cinfo);
    par exemple.

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Par contre, ta boucle d'écriture pose problème, tu parcourt ta matrice comme si elle était d'un seul tenant, alors que c'est un fait un tableau de tableaux.

    Voici la boucle corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        while (cinfo.next_scanline < cinfo.image_height) {
            row_pointer[0] = mat[cinfo.next_scanline];
            jpeg_write_scanlines(&cinfo, row_pointer, 1);
        }

  4. #4
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Merci, mais malheureusement j'ai toujours la même erreur...

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Flaherty Mc Coillean Voir le message
    Merci, mais malheureusement j'ai toujours la même erreur...
    Peux tu poster le code corrigé ?

  6. #6
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    le voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <jpeglib.h>
     
    int main(void)
    {
    unsigned char R[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,247,243,239,235,231,227,223,219,215,211,207,203,199,195,191,187,183,179,175,171,167,163,159,155,151,147,143,139,135,131,128,};
    unsigned char G[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,247,243,239,235,231,227,223,219,215,211,207,203,199,195,191,187,183,179,175,171,167,163,159,155,151,147,143,139,135,131,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};   
    unsigned char B[]={131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,247,243,239,235,231,227,223,219,215,211,207,203,199,195,191,187,183,179,175,171,167,163,159,155,151,147,143,139,135,131,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
    unsigned char **mat;
    int i=0, j=0, nblig=256, nbcol=256;
     
    mat=malloc(nblig*sizeof(unsigned char*));
    if (mat==NULL)
       {
       printf("erreur lors de l'allocation memoire de : mat\n");
       free(mat);
       mat=NULL;
       exit(EXIT_FAILURE);   
       }
    else
       {
       for (i=0;i<nblig;i++)
          {
          mat[i]=malloc((nbcol*3)*sizeof(unsigned char*));
          if (mat[i]==NULL)
             {
             printf("erreur lors de l'allocation memoire de : mat[i]\n");
             for (j=0;j<i;j++)
                {
                free(mat[j]);
                mat[j]=NULL;
                }
             free(mat);
             mat=NULL;
             exit(EXIT_FAILURE);         
             }      
          }
       }
     
    for (i=0;i<nblig;i++)
       {
       for (j=0;j<(nbcol*3);j=j+3)
          {
          mat[i][j]=R[R[i]];
          mat[i][j+1]=G[R[i]];
          mat[i][j+2]=B[R[i]];
          }
       }
     
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr       jerr;
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
     
    cinfo.image_width      = nblig;
    cinfo.image_height     = nbcol;
    cinfo.input_components = 3;
    cinfo.in_color_space   = JCS_RGB;
     
    FILE * outfile;
    outfile = fopen("/home/flaherty/Bureau/hauteur_panache/test.jpeg", "wb");
    if (outfile == NULL) {
       printf("can't open /home/flaherty/Bureau/hauteur_panache/test.jpeg\n");
       exit(1);
       }
    jpeg_stdio_dest(&cinfo, outfile);
     
     
    jpeg_start_compress(&cinfo, TRUE);
    jpeg_set_defaults(&cinfo);
     
    JSAMPROW row_pointer[1];       
    int row_stride;             
    row_stride = nbcol * 3;   
     
    for(i=0;i<nblig;i++)
       {
       row_pointer[0] = mat[i];
       jpeg_write_scanlines(&cinfo, row_pointer, 1);
       }
     
    jpeg_finish_compress(&cinfo)
     
    }
    pour la boucle, j'ai aussi essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        while (cinfo.next_scanline < cinfo.image_height) {
            row_pointer[0] = mat[cinfo.next_scanline];
            jpeg_write_scanlines(&cinfo, row_pointer, 1);
        }
    sans plus de résultats...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/03/2006, 18h39
  2. [DBase][BDE]Insérer des images JPeg dans un table.u
    Par migauvin dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/08/2004, 12h03
  3. Compression d'une série d'images jpeg
    Par Tchello dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2003, 19h59
  4. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo