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 :

Parcourir une image JPEG ?


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Parcourir une image JPEG ?
    Bonsoir,

    voilà j'ai un projet pour la fac et on doit parcourir une image JPEG pour la transformer en noir et blanc (il faut faire la moyenne des 3 couleurs contenue dans le pixel)

    donc j'aimerais savoir comment je peux parcourir une image JPEG pixel par pixel ?

    Il faudra la mettre en paramètre, donc il va falloir faire un truc avec les entrées/sorties ? (STDIN etc ??)

    Si non, comment ?
    Genre je sais que ça se parcourt comme un tableau mais ce que j'ignore c'est "comment je vais indiquer au programme qu'il faut parcourir le tableau DE L'IMAGE"?



    en vous remerciant d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour et bienvenue,

    Une image JPEG est une image comprimée. Et plus précisément, une image ré-exprimée à l'aide de transformées de Fourier et autres joyeuseries mathématiques, fort intéressantes au demeurant. Dans les grandes lignes, on peut dire que c'est le principe du MP3 appliqué à une image plutôt qu'à un son. Ça veut dire que tu ne pourras pas lire la valeur de tes pixels directement depuis le fichier : il va falloir reconstituer l'image en mémoire avant de lui appliquer un traitement, et la re-comprimer ensuite. Partant de ça, il faut savoir à quel niveau se situe ton projet.

    Si c'est à la FAC et que tu découvres le C, je doute qu'on te demande de ré-implémenter toi-même l'algorithme du JPEG (ça reste néanmoins plausible si tu suis une filière en mathématiques appliquées). Il te faudra donc trouver la bonne bibliothèque, la lier à ton programme et lui demander de faire ce travail pour toi. Regarde par exemple du côté de la GDLib. À l'issue, la fonction idoine te renverra un pointeur en mémoire vers les données décodées, pointeur que tu pourras alors exploiter comme un tableau ordinaire.

    Un détail enfin : faire la moyenne des trois composantes primaires est effectivement un bon moyen de désaturer une image, mais souviens-toi que l'œil humain et les supports photographiques réagissent différemment aux différentes longueurs d'ondes. Si tu veux obtenir un résultat plus réaliste, il faudra pondérer chaque fondamentale avec un coefficient dûment choisi.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    tout d'abord, merci de ta réponse

    Oui alors justement, normalement on aura besoin d'un buffer mais j'ai du mal à comprendre comment on met en place un buffer et comment on y accède dans les variables etc ?


    On découvre le C mais je suis en 2ème année donc on a déjà fait "pas mal" de programmation l'an dernier mais on nous a effectivement dit d'utiliser une librairie (libjpeg), je pourrais faire la chose que tu as dit quand même ou ça sera plus compliqué ? (parce que GDlib du coup ça a l'air plutôt pratique si ça permet de faire ça)

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    La GDLib je ne connais pas. Par contre je connais la Glib mais aussi GdkPixbuf. Si ca t'intéresse ca se passe sur www.gtk.org.

    La bibliothèque GdkPixbuf encapsule les bibliothèques nécessaires pour ouvrir/enregistrer un bon nombre de formats graphiques. Sont fonctionnement est des plus simples.

    Je pourrais en quelques lignes de codes te montrer comment ca fonctionne mais je pense que pour l'instant ca ne serait pas t'aider. Par contre tu écris ne pas comprendre le principe des buffers.

    Un buffer est un espace mémoire linéaire. Un simple tableau de unsigned char à une dimension. Il te faudra donc allouer cet espace en fonction de la taille de l'image ouverte. GdkPixbuf fait tout ce travail en interne et te livre ce buffer tout prêt. Ca ne t'empêchera pas d'allouer un autre bloc mémoire pour en faire une copie histoire de répondre convenablement à ton exercice.

    Le tampon mémoire est typiquement arrangé comme ca :
    • les trois premiers octets correspondent aux couleurs R, V et B
    • il peut y avoir un quatrième octet si l'image dispose d'un canal alpha. Ce canal gère la transparence.

    À ma connaissance le format jpeg ne gère pas le canal alpha. Mais ceci reste à vérifier.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ouais mais le problème c'est que je suis pas sûr qu'on ait le droit d'utiliser une autre librairie

    Parce que concrètement, c'est grâce au buffer que je vais pouvoir parcourir l'image ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int i
    for (i=0; i <64500; i++){
        buffer[i] = (unsigned char*) malloc(sizeof(unsigned char)*cinfo.output_width*cinfo.output_components
    }
    Comme ça mon buffer devrait fonctionner vous pensez ? (j'ai oublié de préciser : on a que jusque Lundi en fait donc ça va pas être facile) (je ne m'y mets pas tard on a juste eu que 2 semaines et comme je galère vraiment je me suis décidé ce WE à poster ici : /)

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par Henley Voir le message
    Ouais mais le problème c'est que je suis pas sûr qu'on ait le droit d'utiliser une autre librairie
    Et en quoi est-ce un problème ? Si on te dit d'utiliser libjpeg, juste fait-le ...
    Commence donc par regarder sa documentation pour comprendre comment l'utiliser pour charger un fichier jpeg. A partir de là, tu saura sous quelle forme l'image est réprésentée par les fonctions de cette bibliothèque.
    Comme ça mon buffer devrait fonctionner vous pensez ?
    Pas trop. Une image est rarement représentée par un tableau une dimension.
    Deux dimensions, la largeur et la hauteur de l'image, est la norme.
    Pour une image en couleur, le contenu de chaque élément du tableau n'est en général pas non plus un octet comme dans ton exemple mais plutôt une structure contenant les composantes de base, ou un entier sur 24 ou 32 bits, voire plus.
    ɹǝsn *sıɹɐlos*

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ah d'acc' j'vais lire la doc c'est vrai merci (je savais pas que y'avait une doc pour les fonctions aussi)


    et pour le buffer on m'a aiguillé en fait il fallait que je l'utilise mais pour parcourir la hauteur du tableau donc cette partie là c'est bon ^^

    je reviendrais écrire sur cce topic quand j'aurais un soucis, merci de votre aide les amis

Discussions similaires

  1. Rogner une image jpeg ou bmp
    Par Valeyre dans le forum Langage
    Réponses: 10
    Dernier message: 18/10/2005, 11h01
  2. [ImageMagick] Parcourir une image pixel par pixel
    Par kip dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/10/2005, 14h10
  3. [32 bits] Redimensionner une image JPEG/GIF/PNG...
    Par CR_Gio dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 04/10/2005, 00h57
  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