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

Visual C++ Discussion :

cr�er une Hbitmap


Sujet :

Visual C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut cr�er une Hbitmap
    Je code en C++ sous visual C++.NET et j'utilise les MFC.
    je dispose d'un tableau de pixels, avec pour chaque pixel les valeurs RGB qui correspondent.
    je voudrais afficher l'image qui correspond � ce tableau de bits dans un device context. pour cela j'ai besoin de cr�er un HBITMAP mais je ne vois pas du tout comment faire.
    j'ai r�ussi � afficher une bitmap en faisant
    HBITMAP hbitmap = ::LoadBitmap(...) avec une image bmp qui �tait dans mes ressources, puis cr�ation d'un DC m�moire puis SelectObject et enfin StretchBlt.

    est il possible de cr�er un HBITMAP dynamiquement � partir de mon tableau de pixels? j'ai regard� la doc mais je suis compl�tement perdue avec toutes ces structures.

    y en a t il de vous qui ont d�j� fait �a?

    Merci beaucoup si vous pouvez m'aider

    CeNedra

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    CreateDIBSection() devrait te ravir.
    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.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    Merci je vais regarder de plus pr�s mais �a a l'air de correspondre � ce que je veux.

    ++

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    j'ai regard� pour utiliser la fonction CreateDIBSection, il faut un BITMAPINFO, qui contient un RGBQuad, je ne sais pas � quoi �a correspond?
    puis pour CreateDIBSection, je ne sais pas comment repr�senter mon tableau de pixels, pour le param�tre de type ppvBits, car j'ai trois tableaux avec chacun les valeurs R, G et B pour chaque pixel.
    quelqu'un aurait il un exemple d'utilisation de cette fonction? car j'ai vraiment du mal avec toutes ces fonctions pour les bitmaps.

    merci beaucoup

    ++

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Pour la BITMAPINFO, les structures RGBQUAD sont la palette. Tu n'en as pas besoin si tu es en 24bits ou plus.

    Pour le remplissage des donn�es, �a d�pend du nombre de bits par pixel.
    En 32bits, les donn�es sont une suite de structures RGBQUAD, donc assez facile � remplir � partir de tableaux...
    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.

  6. #6
    mat.M
    Invit�(e)
    Par d�faut
    Citation Envoy� par cenedra
    j'ai regard� pour utiliser la fonction CreateDIBSection, il faut un BITMAPINFO, qui contient un RGBQuad, je ne sais pas � quoi �a correspond?
    puis pour CreateDIBSection, je ne sais pas comment repr�senter mon tableau de pixels, pour le param�tre de type ppvBits, car j'ai trois tableaux avec chacun les valeurs R, G et B pour chaque pixel.
    quelqu'un aurait il un exemple d'utilisation de cette fonction? car j'ai vraiment du mal avec toutes ces fonctions pour les bitmaps.

    merci beaucoup

    ++
    C'est complexe � faire il faut cr�er un BITMAPINFOHEADER etc...
    aller sur www.codeproject.com il ya des tutoriels GDI
    Sinon sur le MSDN il ya des codes sources.
    On peut pas d�tailler ici il y a beaucoup d'op�rations � effectuer

  7. #7
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    en fait j'ai trouv� des exemples mais il me manque des infos:
    dans le cas ou je suis en 24 bits par pixel, soit 8 bits pour chaque composante R, G et B,
    que dois je mettre comme param�tres dans le BITMAPINFOHEADER pour biCompression? j'ai mis pour le moment BI_RGB , et j'ai mis biBitCount=24.
    que mettre dans le RGBQUAD? j'ai vu que �a ne servait � rien en 24 bits par pixels et que c'�tait �gal � NULL.

    mes donn�es sont bien rang�es � l'envers, en partant de la fin et en �crivant B, G puis R c'est �a?

    Merci de me pr�ciser �a car pour le moment, je n'ai qu'une image toute grise qui s'affiche....

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Les donn�es ne sont pas rang�es "� l'envers". Par contre, elles peuvent �tre rang�es de la plus basse ligne � la plus haute, ou le contraire (selon le signe du param�tre de hauteur). Tu peux donc partir du d�but en �crivant R, G, B (enfin il me semble bien qu'en 24bits, c'est dans cet ordre).

    Pour ce qui est de la BITMAPINFO/BITMAPINFOHEADER, �a m'a l'air OK.
    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.

  9. #9
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    mes donn�es ne doivent pas �tre rang�es correctement alors.
    car si je met pour chaque pixel toute mes composantes � 0 ou � 255; j'obtiens bien une image noire ou blanche.
    cependant pour les autres couleurs, si je met une composante � 255, je n'obtiens pas de bleu, vert ou rouge, mais qqch de noir!
    je vais revoir mon rangement de donn�es.
    ne faut il pas terminer les lignes avec un certain nombre d'octets? j'avais cru avoir lu �a....

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Oui, les lignes d'un bitmap doivent �tre DWORD-aligned.

    Franchement, si tu travailles en m�moire, je te conseillerais d'utiliser des bitmaps 32bits, quand m�me beaucoup plus simples � manier qu'en 24bits.
    Quitte � les reconvertir ensuite en 24bits si tu veux sauvegarder...
    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.

  11. #11
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    ok ok j'essaye en 32 bits.
    je n'ai rien d'autre � faire que de pr�ciser 32 bits dans le biBitcount?
    je vais essayer de ranger mes donn�es correctement, j''ai mis pour le moment RGB pour chaque pixel, et dans le bon ordre...

  12. #12
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    bon j'ai essay� mais l� je n'ai rien d'affich�.
    faut il que je mette le dernier octet � 0? car pour chaque pixel j'ai mis R, G puis B pour les 3 premiers mais le dernier n'a rien!
    d�sol�e pour ces questions, mais je d�bute avec �a et c'est po facile.

    merci!

  13. #13
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Je crois bien qu'en 32bits, tu peux consid�rer chaque pixel comme une structure RGBQUAD (Edit: Je peux confirmer, c'est bien �a).
    Et oui, � moins que tu ne veuilles jouer avec la transparence, tu dois mettre la derni�re valeur � z�ro.
    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.

  14. #14
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    ah je n'ai qu'une bande gris en haut de l'image et une bande noire en bas!
    si je m'�tais tromp� dans l'ordre des couleurs je veux bien mais l� j'essayais de faire une image noire ou blanche ou rouge ou...
    bon il faut que je m'en sorte auourd'hui!!

  15. #15
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Bon, voici une fonction que j'utilisais pour dessiner un d�grad� horizontal de couleur dans un bitmap 32bits (un bitmap qui fait forc�ment 256 pixels de large, dans le cas pr�sent)

    Note: ROUGE, VERT et BLEU sont les valeurs d'une Enum dont je me sert pour indiquer quelle est la couleur qui varie.
    Si m_eCouleurVariable est BLEU, alors les composantes rouge et vertes sont fixes et la composante bleue varie de 0 � 255.
    Code C++ : 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
    /* Fonction pour remplir le bitmap
       ------------------------------- */
    void CControleCouleur::RemplirBitmap(LPVOID pt_bits, int cy) const
    {
    RGBQUAD rgbCouleur = {m_nCouleurs[BLEU], m_nCouleurs[VERT], m_nCouleurs[ROUGE], 0};
    RGBQUAD * pt_rgbCouleur = static_cast< RGBQUAD * >(pt_bits);
    size_t nWidthBytes = 256 * sizeof(*pt_rgbCouleur);
     
    //Remplir la première ligne
    for(int i=0 ; i<256 ; i++)
    	{
    	switch(m_eCouleurVariable)
    		{
    		case ROUGE: rgbCouleur.rgbRed   = static_cast< BYTE >( i ); break;
    		case VERT : rgbCouleur.rgbGreen = static_cast< BYTE >( i ); break;
    		case BLEU : rgbCouleur.rgbBlue  = static_cast< BYTE >( i ); break;
    		}//switch
    	*pt_rgbCouleur = rgbCouleur;
    	pt_rgbCouleur++;
    	}
     
    //copier la première ligne sur toutes les suivantes.
    for(int y=1 ; y < cy ; y++)
    	{
    	CopyMemory(pt_rgbCouleur, pt_bits, nWidthBytes);
    	pt_rgbCouleur += 256;
    	}
    }

    Le bitmap �tait cr�� comme �a:
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //Création du bitmap avec la taille de la fenêtre (largeur=r.right, hauteur=r.bottom)
    //Le sens du bitmap (haut, bas) n'a pas d'importance.
    BITMAPINFO bi = {
     {sizeof(bi.bmiHeader), r.right, r.bottom, 1, 32, BI_RGB, 0, 0, 0, 0, 0},
     {{0,0,0,0}}
     };
     
    LPVOID pt_bits = NULL;
    HBITMAP hNouveauBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &pt_bits, NULL, 0);
    if(hNouveauBitmap)
    	{
    	//Remplir le bitmap
    	RemplirBitmap(pt_bits, r.bottom);
    	}
    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.

  16. #16
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 46
    Par d�faut
    c'est bon, j'ai r�ussi � afficher une image unie, donc je vais m'en sortir sans probl�mes pour la suite!!

    Merci � tous pour votre aide!!

    CeNedra

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Crystal Report 8] cr�er une source de donn�es oracle
    Par Lina dans le forum SAP Crystal Reports
    R�ponses: 4
    Dernier message: 14/11/2002, 13h53
  2. [R�seau] Cr�er une connexion Internet
    Par Tranber dans le forum VB 6 et ant�rieur
    R�ponses: 11
    Dernier message: 17/10/2002, 17h01
  3. cr�er une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    R�ponses: 3
    Dernier message: 01/10/2002, 16h48
  4. Cr�er une fen�tre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    R�ponses: 4
    Dernier message: 17/07/2002, 10h46
  5. R�ponses: 8
    Dernier message: 16/04/2002, 16h20

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