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 :

traitement image fichier bmp


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 8
    Points
    8
    Par défaut traitement image fichier bmp
    Bonjour

    je réalise un programme de traitement d'image de fichier bmp en m’inspirant d'une source http://fvirtman.free.fr/recueil/01_09_02_testbmp.c.php

    Je n'arrive pas à comprendre le fonctionnement de 2 fonctions essentielles getPixel et Set Pixel. Comment peut-on changer la valeur d'un pixel ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void SetPixel(Image* I,int i,int j,Pixel p)
    {
    	assert(I && i>=0 && i<I->w && j>=0 && j<I->h);
    	I->dat[I->w*j+i] = p;
    }
     
    Pixel GetPixel(Image* I,int i,int j)
    {
    	assert(I && i>=0 && i<I->w && j>=0 && j<I->h);
    	return I->dat[I->w*j+i];
    }
    Pouriez-vous m'expliquer ?

    merci

  2. #2
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Bonjour,

    Dans ton lien, dans 01_09_02_bmp.h, on peut lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Image
    {
    	int w,h;
    	Pixel* dat;
    } Image;
    • w (width) est la largeur.
    • h (height) est la hauteur.
    • dat est le pointeur vers le premier élément d'un tableau à une dimension contenant les w*h pixels. Le tableau contient chaque ligne de l'image, les unes à la suite des autres. Ainsi, pour tout entier i dans [0 ; w [, pour tout entier j dans [0 ; h [, le pixel de coordonnées (i, j) dans ton image sera le pixel numéro w*j+i dans ce tableau.


    Le code suivant crée une image noire de taille 5x5 et met le pixel du milieu en blanc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Le code RGB du blanc est (255, 255, 255).
    Pixel blanc;
    blanc.r = 255;
    blanc.g = 255;
    blanc.b = 255;
     
    Image* I = NouvelleImage(5,5); // créer une image noire de taille 5x5
    SetPixel(I, 2, 2, blanc); // mettre le pixel du milieu à blanc

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Note: Si j'ai bien compris, ce code gère l'image en mémoire avec 32 bits (4 octets, dont trois utiles) par pixel (qu'il convertit de/vers 24 bits (trois octets, tous utiles) par pixels lors du chargement et de la sauvegarde).

    Dans une image Bitmap codée sur 16bpp, 24bpp ou 32bpp, l'en-tête est suivi directement par un tableau de longueur×largeur* mots de 16/24/32 bits. Chacun de ces mots correspond directement aux trois valeurs (Rouge, Vert, Bleu) d'un pixel de l'image.
    Le code fourni gère ça comme un tableau de longueur×largeur structures Pixel. Lors du chargement, le code lit l'en-tête pour obtenir la taille du tableau, puis lit les valeurs de pixels (mots de 24 bits) qu'il convertit en structures Pixel. Les fonctions GetPixel() et SetPixel() permettent de manipuler directement ces valeurs dans le tableau, et la fonction de sauvegarde re-convertit le tout en image BMP 24 bpp...


    *Pas exactement à cause des contraintes d'alignement (c'est à ça que servent les variables corrpitch et pitch dans le code), mais sur une image 32bpp, c'est toujours le cas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Ne serait-il pas plus simple de lui dire que tab[(i * w) + j] correspond à tab[i][j] avec des lignes ayant w valeurs.

    En gros ton tableau à 2D/ ta matrice de taille w*h est stocké(e) dans un tableau linéaire 1D dans lequel les lignes sont mises bout à bout.

Discussions similaires

  1. [Image] API De traitement de fichier JPEG
    Par Floréal dans le forum 2D
    Réponses: 10
    Dernier message: 20/01/2010, 09h42
  2. Réponses: 2
    Dernier message: 19/08/2009, 16h59
  3. Réponses: 0
    Dernier message: 18/08/2009, 15h59
  4. Réponses: 1
    Dernier message: 26/04/2009, 09h31
  5. Sauver un TCanvas dans un fichier image (jpg, bmp, etc.)
    Par Angrim dans le forum C++Builder
    Réponses: 2
    Dernier message: 30/11/2007, 19h34

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