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

PyQt Python Discussion :

Gomme et QImage [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 102
    Par défaut Gomme et QImage
    Bonjour à tous, suite à ma discussion (cf.lien
    http://www.developpez.net/forums/d12...e/#post6726180 )

    J'aimerais pouvoir implémenter une gomme qui effacerait les "imperfections " d'une QImage, je vais me pencher plus sérieusement sur la questions.
    Merci d'avance pour votre aide ^^.

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 102
    Par défaut Première idée
    Après réflexion, je pense qu'une solution serait d'avoir un "Pen" qui soit de la même couleur que le fond de l'image ou la couleur sélectionnée et qui effacerai
    les imperfections.

    Ce qui me manque, c'est qu'il faut surcharger paintEvent j'imagine ? Il est possible que d'avoir une seule méthode paintEvent ?
    Rajouter une sorte de "pen" je sais qu'on peut mettre une image dans le brush, j'aimerais récupérer la couleur du pixel que je sélectionne pour la mettre dedans, je ne sais pas si c'est possible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      def paintEvent(self, e):
            painter = QPainter(self)
            painter.drawImage(self.rect(), self.__image)
            self.pen = QPen()
            self.pen.setWidth(3);
            self.pen.setBrush(green);
            painter.setPen(self.pen);
    Merci de vos conseils.

  3. #3
    Membre expérimenté Avatar de ashren
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 101
    Par défaut
    Pas besoin de surcharger à nouveau paintEvent, définit une variable du genre 'mode' pour savoir si on doit sélectionner ou bien gommer, puis utilise cette variable dans le mouseEnterEvent et mouseMoveEvent pour dessiner la couleur de ton choix à l'emplacement désiré (contenu dans l'évènement).

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 102
    Par défaut Précision
    Selon toi , je devrais donc utiliser cette variable avec une sorte de if en gros si jamais le mode gomme est on, j'active la fonction avec la couleur choisie sinon je sélectionne.
    ça me parait pas mal, je vais travailler ça.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 102
    Par défaut Premier Essai
    J'ai réussi sur un de mes test à dessiner mes traits comme je voulais. Cependant dans mon projet réel , j'ai du mal à permettre l'activation du dessin.
    De plus, j'aimerais un cercle plein et j'ai du mal à voir comment le faire en python :s
    Voici mon code :
    Merci encore et bon week end^^
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    from PySide.QtGui import QApplication, QWidget, QPainter, QKeySequence,QColor
    from PySide.QtGui import QImage, QRubberBand, QMainWindow, QAction, QMenuBar, QFileDialog, QScrollArea
    from PySide.QtCore import QSize, QRect,QRectF
     
    class MainWindow(QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.image = ImageView(QImage())
            self.resize(500, 300)
            self.setWindowTitle("Image loader")
     
            """
            Add of scroll bars to see properly the images
            """
            self.area = QScrollArea(self)
            self.area.setWidget(self.image)
            self.area.setWidgetResizable(True)
            self.setCentralWidget(self.area)
            """
                Add of the Menu which contains all the features like of Open/Save/..
                and the edit options
            """
            menu = QMenuBar()
            self.setMenuBar(menu)
            _file = menu.addMenu('File')
            _edit = menu.addMenu("Edit")
            # Menu Open
            _action = QAction('Open', _file,shortcut=QKeySequence.Open)
            _action.triggered.connect(self.__actionOpen)
            _file.addAction(_action)
            # Menu Save
            _action = QAction('Save', _file,shortcut=QKeySequence.Save)
            _action.triggered.connect(self.__actionSave)
            _file.addAction(_action)
            # Menu Close
            _action = QAction('Close', _file,shortcut=QKeySequence.Close)
            _action.triggered.connect(self.__actionClose)
            _file.addAction(_action)
            #Menu Edit
            _action = QAction("Rubber On",_edit)
            _action.triggered.connect(self.__actionRubber)
            _edit.addAction(_action)
     
        def __actionOpen(self):
            _file = QFileDialog.getOpenFileName(self, "Open Image", "", "Image Files (*.png *.jpg *.bmp)")
            if _file:
                self.image.setWorkingImage(QImage(_file[0]))
            else:
                print "Invalid Image"
     
        def __actionSave(self):
            _file = QFileDialog.getSaveFileName(parent=None, caption="Save image as")
            _result = self.image.workingImage().save(_file[0], "BMP", -1)
            # Test to know if it's working
            if _result:
                print "Saved successfully"
            else :
                print "Saving failed"
     
        def __actionClose(self):
            self.close()
     
        def __actionRubber(self):
            self.__mode = "rub"
     
     
    class ImageView(QWidget):
        def __init__(self, image, parent=None):
            super(ImageView, self).__init__(parent=parent)
            self.__image = image
            #Init of the boolean to know whether we select or rub
            self.__mode = "rub"
            #Init of selection 
            self.__band = QRubberBand(QRubberBand.Rectangle, self)
            self.__origin = None
            #Init of rubber
            #the rub is a rectangle that should be the size of one pixel and the color and full
            # of the one selected
            self.__rub= QRectF(10.0, 20.0, 80.0, 60.0)
        def setWorkingImage(self, img):
            self.__image = img
            self.setMinimumSize(img.size())
            self.update()
     
        def workingImage(self):
            return self.__image
     
        def mousePressEvent(self, e):
            self.__origin = e.pos()
            if self.__mode =="select":
                self.__band.setGeometry(QRect(self.__origin, QSize()))
                self.__band.show()
            if self.__mode =="rub":
                self.paintEvent(e)
        def mouseReleaseEvent(self, e):
            self.__band.hide()
            print "La selection est :", QRect.intersect(self.__band.geometry(), self.rect())
     
        def mouseMoveEvent(self, e):
            self.__band.setGeometry(QRect(self.__origin, e.pos()).normalized())
     
        def paintEvent(self, e):
            painter = QPainter(self)
            painter.drawImage(self.rect(), self.__image)
            if self.__mode=="rub":
                painter.drawLine(100,200,100,200)
     
    if __name__ == '__main__':
        app = QApplication([])
        win = MainWindow()
        win.show()
        app.exec_()

  6. #6
    Membre expérimenté Avatar de ashren
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 101
    Par défaut
    Ne dessine pas la ligne dans le paintEvent, créé un QPainter sur ta QImage interne et dessine dessus.

    Selon le mode, tu récupère les coordonnées d'origine lors d'un mousePressEvent et tu dessine ta ligne lors du mouseReleaseEvent.

    EDIT: pour voir ta ligne se dessiner (pour savoir où relâcher la souris comme dans tout logiciel de dessin), dessine la aussi avec le QPainter du paintEvent juste après le drawImage.

    Pour le cercle, voir la méthode drawArc de QPainter.

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

Discussions similaires

  1. création d'un objet QImage
    Par Watier_53 dans le forum Qt
    Réponses: 14
    Dernier message: 01/01/2008, 19h12
  2. Problème avec QImage et QPainter
    Par Watier_53 dans le forum Qt
    Réponses: 5
    Dernier message: 19/12/2007, 10h42
  3. Question et boule de gomme
    Par said0011 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/11/2007, 19h13
  4. [ActionListener] mystère et boule de gomme
    Par jcodeunpeu dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 23/12/2005, 22h09
  5. [PyQt] QImage
    Par Jbx 2.0b dans le forum PyQt
    Réponses: 1
    Dernier message: 01/02/2005, 23h06

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