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

Qt Discussion :

Qt et zommer une image


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut Qt et zommer une image
    Bonjour, j'ai un probléme pour faire le zoom d'une image.Ce que j'ai compris c'est que je dois scaled chaque pixel de l'image
    et plus simplement utiliser le QImage de l'image.
    Voila j'affiche mon image et j'ai fais deux fonctions ZoomIn et ZoomOut, pour que à chaque fois que je clique sur l'un des boutons
    associé qui appelle l'une des fonctions que mon image soit Zoomée ou DéZommée, sauf que ce que j'ai fais ça ne marque pas!!Si quelqu'un peut m'aider svp!J'ai l'idée de "scaled" mais je comprends pas comment faire !!
    Merci d'avance!


    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
    26
    27
    28
    29
    30
    31
    32
    33
     QImage img(NbColumns, NbRows, QImage::Format_RGB32);
            for (int y = 0; y < NbRows(); y++)
            {
                     for (int x = 0; x < NbColumns; x++)
                      {
     
     
                         float  pixel = (BufferImage[y * NbColumns + x] ) ;
     
                                  img.setPixel(x , y , qRgb(pixel , pixel, pixel ));
     
                        }
                 }
     
     
     
            m_label = new QLabel ;//initialisé le pointeur
            m_label->setPixmap(QPixmap::fromImage(img).scaled(NbRows, NbColumns, Qt::KeepAspectRatio));
     
     
     
    void maClass::ZoomIn()
    {
        double factorIn = 2.0 ;
        img.scaled(1800 * factorIn, 1500 * factorIn) ;
     
    }
     
    void maClass::ZommOut()
    {
        double factorOut = 0.8 ;
        img.scaled(1800 * factorOut, 1500 * factorOut) ;
    }

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    QImage n'a pas de représentation graphique. C'est une classe qui permet de gérer "les données d'une image", au sens fichier du terme. Mais on ne peut pas l'afficher directement.

    QPixmap sert à l'afficahge (mais ne permet pas la modification du contenu). Cependant, QPixmap suffit pour faire des zooms, car il est inutile de modifier le contenu de l'image, pour l'afficher differemment.

    Ci joint, un petit code cadeau. Utilise la molette de ta souris.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <QtGui>
    #include <QtCore>
     
    class MyTest : public QLabel
    {
    public:
    	MyTest():QLabel()
    	{
    	size=400;
    	setFixedSize(500,500);
    	}
     
    	void wheelEvent(QWheelEvent *event)
    	{
    		if(event->delta()>0)
    			size+=50;
    		else
    			size-=50;
     
    		setPixmap(basePix.scaled(size, size));
     
    		event->ignore();
    	}
     
    	void setPix(QString newPix)
    	{
    		basePix.load(newPix);
    		setPixmap(basePix.scaled(size, size));
    	}
    private:
     
    	QPixmap basePix;
    	int size;
    };
     
    int main(int argc, char** argv)
    {
    	QApplication app(argc, argv);
    	MyTest test;
    	test.show();
    	test.setPix(QFileDialog::getOpenFileName(&test, ("Open Image File"),QCoreApplication::applicationDirPath(), ("Images (*.png *.xpm *.jpg)")));
     
    	return app.exec();
    }
    G.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Bonjour, Merci pour ton code, c'est bien ce que je cherchais!
    J'ai essayé de l'adapté a mon code, mais j'ai du mal.Car moi j'affiche mon image dans un QLabel comme toi sauf que pour moi le QLabel est contenu dans un QScrollArea et quand je bouge la molette de la souris ya toute l'image qui disparait.Assez bizarre chose que j'arrive pas a comprendre alors que si l'image est contenu seulement dans le QLabel ça marche parfaitement. Je sais pas si je dois faire une methode pour gerer les crollBars , je croyais que ça devais se faire tout seul?
    Et une question :est ve que je dois utiliser obligatoirement la metode setPix, car moi je lis mon image dans un QDialog apart?Enfin voici mon code d'adaptation:



    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
    26
         sizeR =1900 ; //Fixe la taille d'apparition avant le zoom.
         sizeC =1400 ; //dans le constructeur
    void Maclass::wheelEvent(QWheelEvent *event)
    {
      if(event->delta()>0)
       {
          sizeR+= 50 ; //Pas de zoom avec la molette de la souris.
          sizeC+= 50 ;
       }
        else
         {
           sizeR-= 50 ;
           sizeC-= 50 ;
         }
     
             m_label->setPixmap(basePix.scaled(sizeR, sizeC)) ;//Adapter à une image carrée!
             ui->ZoneImage->setWidget(m_label) ;
             event->ignore() ;
    }
     
    void Maclass::setPix(QString newPix)
       {
           basePix.load(newPix);
           m_label->setPixmap(basePix.scaled(sizeR, sizeC)) ;
     
       }
    et voici comment je lis et j'affiche mon image:

    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
    QString filename = QFileDialog::getOpenFileName(0, QString(), QString(), tr("Image (*)")) ;
     QImage img(NbColumns, NbRows, QImage::Format_RGB32) ;
            for (int y = 0; y < NbRows; y++)
            {
                     for (int x = 0; x < NbColumns; x++)
                      {
     
     
     
                           pixelFloat = 255 * ((BufferImage[y * NbColumns + x] ) - minim)
                                                      / (maxim - minim) ;
     
     
     
                                        img.setPixel(x,y, qRgb(pixelFloat, pixelFloat, pixelFloat)) ;
     
     
            QLabel m_label = new QLabel ;//initialisé le pointeur
            m_label->setPixmap(QPixmap::fromImage(img)) ;
     
             QScrollArea ZoneImage ;
             ZoneImage->setWidget(m_label) ;
    I need help please!
    Merci d'avance

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut,

    Non, tu n'es pas du tout obligé d'utiliser la méthode setPix() que j'ai défini. L'important, c'est que tu gardes une référence sur ton image (dans mon cas cette image s'appelle "basePix"). Après, tu peux la charger comme tu veux, à partir d'une QImage, ou d'un fichier.

    Libre à toi.

    Une autre remarque, qui correspond peut être à ton problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QLabel m_label = new QLabel ;//initialisé le pointeur
            m_label->setPixmap(QPixmap::fromImage(img)) ;
     
             QScrollArea ZoneImage ;
             ZoneImage->setWidget(m_label) ;
    Je ne sais pas ou tu fais cette declaration, mais ton QScrollArea sera détruit à la fin de ton bloc, vu que c'est une variable locale. C'est peut etre pour cela que ton image s'efface. D'ailleurs c'est
    bizarre que tu fasse ZoneImage->. Tu dois avoir plusieurs QScrollArea, avec différentes portées, nommées ZoneImage. Attention aux confusions !

    G.

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

Discussions similaires

  1. Resize d'une image
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 13/07/2008, 22h23
  2. Zommer une image selon une echelle donnée
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 30/06/2006, 18h05
  3. Réponses: 3
    Dernier message: 12/06/2002, 19h03
  4. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

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