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 :

Afficher un CImg


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Par défaut Afficher un CImg
    Bonjour,

    J'ai créé une classe de traitement d'image en application console Win32 qui utilise la bibliothèque graphique CImg.

    Je souhaite maintenant utiliser ma classe dans une application MFC.

    Mon probleme est pour afficher mes images dans ma vue. J'utilise cette méthode : http://www.developpez.net/forums/sho...=image+matrice
    mais je la trouve beaucoup trop lente ; mon image met plus d'une demie seconde à se rafraichire. C'est très embêtant pour redimensionner la fenêtre et je n'ai pas encore essayé de dessiner sur l'image mais j'imagine le resultat.

    Existe t'il une methode plus rapide ?

    Pour info, j'ai créé une fonction Draw(CDC *pDC) dans ma classe. J'appelle cette fonction dans le onDraw de ma vue.

    Merci.

  2. #2
    Membre actif
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Par défaut
    Re-bonjour,

    Voila ce que j'ai fait :

    La classe que j'ai créée hérite de CImg.

    J'ai ajouté une fonction Draw à ma classe :

    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
     
    template<class T>
    void CSuperImage<T>::Draw(CDC* pDC, const unsigned int &unViewWidth, const unsigned int &unViewHeight, const float &fZoom) const
    {	
     	CDC MemDC;
    	CBitmap Bitmap;
    	CSuperImage<T> Temp(get_resize2D(fZoom, 1));
    	MemDC.CreateCompatibleDC(pDC);// creation d'un DC en memoire
    	Bitmap.CreateCompatibleBitmap(pDC,Temp.width + 2, Temp.height + 2);
     
    	MemDC.SelectObject(&Bitmap);
     
    	for (unsigned int x(0) ; x < Temp.width ; x++)
    		for (unsigned int y(0) ; y < Temp.height ; y++)
    		{
    			MemDC.SetPixel(x + 1, y + 1, RGB(Temp(x,y,0,0), Temp(x,y,0,1), Temp(x,y,0,2)));
    		}
     
    	pDC->BitBlt(((int)unViewWidth - (int)(Temp.width + 2)) < 0 ? -1 : (unViewWidth - (Temp.width + 2)) / 2,
    			((int)unViewHeight - (int)(Temp.height + 2)) < 0 ? -1 : (unViewHeight - (Temp.height + 2)) / 2,
    			Temp.width + 2, Temp.height + 2,
    			&MemDC,
    			0,0,
    			SRCCOPY);
    }
    Le probleme de cette méthode, c'est le MemDC.SetPixel() qui prend un temps fénoménale à l'affichage.

    La classe CImg a une donnée membre data qui est un pointeur sur le premier pixel du buffer. J'ai donc pensé modifier ma fonction comme suit :

    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
     
    template<class T>
    void CSuperImage<T>::Draw(CDC* pDC, const unsigned int &unViewWidth, const unsigned int &unViewHeight, const float &fZoom) const
    {	
     	CDC MemDC;
    	CBitmap Bitmap;
    	CSuperImage<T> Temp(get_resize2D(fZoom, 1));
    	MemDC.CreateCompatibleDC(pDC);// creation d'un DC en memoire
    	Bitmap.CreateCompatibleBitmap(pDC,Temp.width, Temp.height);
     
    	MemDC.SelectObject(&Bitmap);
     
    	Bitmap.SetBitmapBits(sizeof(T) * Temp.size(), data);
     
    	pDC->BitBlt(((int)unViewWidth - (int)(Temp.width + 2)) < 0 ? -1 : (unViewWidth - (Temp.width + 2)) / 2,
    			((int)unViewHeight - (int)(Temp.height + 2)) < 0 ? -1 : (unViewHeight - (Temp.height + 2)) / 2,
    			Temp.width + 2, Temp.height + 2,
    			&MemDC,
    			0,0,
    			SRCCOPY);
    La vitesse d'affichage est maintenant parfaite.

    Le probleme maintenant, c'est ça qu'a l'affichage j'ai 12 fois mon image en plus petit et en niveaux de gris. 4 colonnes et 3 lignes qui doivent correspondrent au 3 couleur et un ligne toute noire tout en bas.

    Et ca devient n'importe quoi quand je fait des zooms.

    Je suis perdu. D'où vient l'érreur ?

    Aidez moi !!!!

Discussions similaires

  1. Afficher matrice en couleur avec Cimg
    Par godskitchen dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 26/10/2011, 14h05
  2. afficher une image avec cimg
    Par maissaab dans le forum C++
    Réponses: 4
    Dernier message: 23/06/2010, 07h42
  3. CIMg : Afficher une image sous la forme d'une matrice
    Par nicoblade77240 dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 26/02/2009, 10h46
  4. afficher du texte
    Par Mau dans le forum OpenGL
    Réponses: 10
    Dernier message: 24/06/2003, 15h31
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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