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

MFC Discussion :

Comment créer un index pour afficher une image 24 bits?


Sujet :

MFC

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Points : 148
    Points
    148
    Par défaut Comment créer un index pour afficher une image 24 bits?
    Bonjour,

    Je voudrais savoir comment puis je créer une palette RGB pour des images 24 bits.
    Voilà ce que je fais pour la palette en niveau de gris


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for &#40;long j=0; j<256; j++&#41; &#123;
      BYTE i=&#40;BYTE&#41;j;
      RGBQUAD n1=&#123;i,i,i,i&#125;;// idx,R,G,B
      tmph.SetPaletteColor&#40;i,n1&#41;;// affectation de la palette à l'image tmph
    &#125;
    Merci.
    L'union fait la force.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour
    Alors pour ce qui est des formats d'images, les images 24 bits ne sont pas indéxables avec des formats "classiques" (bmp, jpg, png,...) (et oui c'est comme ca)

    Mais si ta question (elle est un peu ambigüe) était "Comment créer un index pour afficher une image 24 bits", là il faudra chercher des fonctions statistiques de comptage de couleur qui dégagent des gros bloc de couleur.

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Points : 148
    Points
    148
    Par défaut
    voila, je change de question pour lever l'ambiguité.
    Merci mabu.

    Je vous explique mon problème :
    j'ai la bande Rouge, Verte et Bleu d'une image.
    Donc au départ 3 images qui représentent les 3 bandes. Je veux à partir de ses 3 images créer une seule image en RVB.

    Ce que je fait actuellement, je crée le nouveau fichier BMP mais il me reste à définir la palette.
    L'union fait la force.

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bien
    Alors une image RVB n'a pas de palette.
    Pour créer une telle image il faut :
    Créer le Header qui indique la type, la taille du fichier...
    -BITMAPFILEHEADER
    Créer le Header qui indique image 24 bits, dimension...
    -BITMAPINFOHEADER
    remplir l'image avec la structure qui RGB convient :
    -le premier octet Rouge, le premier octet Vert, le premier Bleu, le deuxième Rouge...

    Pour plus de renseignements, va faire un tour sur le site msdn : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_1rw2.asp
    le principe des Bmp y est expliqué.

    (Au passage, avec quelle(s) librairie(s) travailles tu ? car en .net, la création d'une telle image est triviale.)

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Points : 148
    Points
    148
    Par défaut
    Tout à fait c'est ce que je fais.
    Pour comprendre mon code quelques explications :
    j'ai une grande image qui est constituée de la bande R à sa droite la bande Verte et sa droite Bleue.
    Ce qui revient pour une ligne de la grande image (par exemple 600 pixels) = 200 pixels de la bande R + 200 pixels de la bande V + 200 pixels de la bande B
    Donc ce qu'on voit dans la grande image c'est 3 fois la même image une à côté de l'autre mais chacune dans une bande.
    En fait j'utilise CxImage (des classes OpenSource)

    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
     
    // création de la nouvelle image
    CxImage tmph&#40;headDiv3,head.biHeight,&#91;b&#93;8&#91;/b&#93;&#41;;// Si cette valeur à 8 alors l'image affichée est en noir sinon rien n'est affichée si je la mets à 24 !!!!
     
    	for&#40;long y=0; y<head.biHeight; y++&#41;&#123;
    		for&#40;long x=0; x<headDiv3; x++&#41;&#123;
    			colorR = GetPixelColor&#40;x,y&#41;;
    			colorG = GetPixelColor&#40;x+headDiv3,y&#41;;
    			colorB = GetPixelColor&#40;x+headDiv3Fois2,y&#41;;
    // affectation comme tu le dis R V B R V B ...
    			if &#40;img&#41; tmph.SetPixelIndex&#40;x,y,colorR.rgbRed&#41;;
    			if &#40;img&#41; tmph.SetPixelIndex&#40;x,y,colorG.rgbGreen&#41;;
    			if &#40;img&#41; tmph.SetPixelIndex&#40;x,y,colorB.rgbBlue&#41;;
     
    		&#125;
    	&#125;

    Donc je laissera la valeur à 8
    et j'initialise la palette comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if &#40;img&#41; 
    	&#123;
    		for&#40;long j=0; j<256; j++&#41;&#123;
    			BYTE i=&#40;BYTE&#41;j;
    			RGBQUAD n1=&#123;i,i,i,0&#125;;
    			tmph.SetPaletteColor&#40;i,n1&#41;;
    		&#125;
    	&#125;
    ainsi l'affichage se fera en niveau de gris.
    je ne sais pas comme initialiser cette palette pour afficher l'image en couleur.
    L'union fait la force.

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Pour obtenir une image non indéxées, il faudra utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetPixelColor&#40;x,y, couleurRGB &#41;;
    De plus, il y a un problème dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             if &#40;img&#41; tmph.SetPixelIndex&#40;x,y,colorR.rgbRed&#41;;
             if &#40;img&#41; tmph.SetPixelIndex&#40;x,y,colorG.rgbGreen&#41;;
             if &#40;img&#41; tmph.SetPixelIndex&#40;x,y,colorB.rgbBlue&#41;;
    Aura pour effet de copier dans ton image uniquement la composante Bleue de l'image, En fait avec ces trois lignes, tu écris trois fois au même endroit

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Points : 148
    Points
    148
    Par défaut
    Merci beaucoup mabu.

    Tu avais raison j'ai pas fais attention, il fallait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if &#40;img&#41; tmph.SetPixelIndex&#40;3*x,y,colorR.rgbRed&#41;;
    if &#40;img&#41; tmph.SetPixelIndex&#40;3*x+1,y,colorG.rgbGreen&#41;;
    if &#40;img&#41; tmph.SetPixelIndex&#40;3*x+2,y,colorB.rgbBlue&#41;;
    En plus ça marche à merveille ta remarque sur l'image non indexé.
    L'union fait la force.

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Je t'en prie, ce fut un plaisir, j'ai moi même beaucoup galéré pour ce genre de choses (et même encore aujourd'hui)

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

Discussions similaires

  1. créer un bouton pour afficher une image
    Par wawrint dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 11/07/2008, 13h08
  2. Problème pour afficher une image bmp
    Par homeostasie dans le forum MFC
    Réponses: 6
    Dernier message: 08/05/2005, 19h36
  3. [MFC]Problème pour afficher une image.
    Par Deedier dans le forum MFC
    Réponses: 4
    Dernier message: 25/03/2005, 17h13
  4. Réponses: 13
    Dernier message: 23/12/2004, 19h01
  5. Comment faire pour afficher une image ds une dbgrid
    Par totomaze dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/10/2004, 16h31

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