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 :

Dessin à la souris sur une image


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Dessin à la souris sur une image
    Bonjour,

    C'est encore moi. J'ai trouvé ce petit bout de code fort intéressant qui permet de dessiner via le curseur de la souris. Le résultat que je souhaite obtenir c'est de pouvoir dessiner par dessus une photo afin d'y mettre des annotations.

    Je galère un peu avec les différents widgets (QLabel, QWidget, QGraphicsView) qui permettent ou non d'afficher une photo.

    Est-ce que peux directement intégrer une photo dans mon QGraphicsView ou est-ce que je dois passer par un autre widget ?


    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
    from PyQt4 import QtGui, QtCore
    import sys
     
     
    class GraphicsView(QtGui.QGraphicsView):
     
        start = None
        end = None
        item = None
        path = None
     
        def __init__(self, parent = None):
            super(GraphicsView, self).__init__()
            self.setScene(QtGui.QGraphicsScene())
            self.path = QtGui.QPainterPath()
            self.item = GraphicsPathItem()
            self.scene().addItem(self.item)
     
        def mousePressEvent(self, event):
            self.start = self.mapToScene(event.pos())
            self.path.moveTo(self.start)
     
        def mouseMoveEvent(self, event):
            self.end = self.mapToScene(event.pos())
            self.path.lineTo(self.end)
            self.start = self.end
            self.item.setPath(self.path)
     
    class GraphicsPathItem(QtGui.QGraphicsPathItem):
     
        def __init__(self):
            super(GraphicsPathItem, self).__init__()
            pen = QtGui.QPen()
            pen.setColor(QtGui.QColor("black"))
            pen.setWidth(10)
            self.setPen(pen)
     
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        mw = GraphicsView()
        mw.show()
        sys.exit(app.exec_())

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ça se fait directement dans la scene.
    Il faut prévoir de lui donner d'abord les dimensions de l'image pour qu'elle reste centrée dans la vue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        def display_background(self, filename):
            width, height = self.width(), self.height()
            img = QImage(filename)
            # On met l'image à la dimension de la fenêtre
            pixmap = QPixmap.fromImage(img.scaled(width, height, 
                                             Qt.KeepAspectRatio, 
                                             Qt.SmoothTransformation))
            self.scene().setSceneRect(0, 0, pixmap.width(), pixmap.height())
            self.scene().addPixmap(pixmap)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup

    Si ça peut aider quelqu'un dans le besoin je mets le code ci-dessous :

    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
    from PyQt4 import QtGui, QtCore
    import sys
     
    filename = "Votre image"
    class GraphicsView(QtGui.QGraphicsView):
     
        start = None
        end = None
        item = None
        path = None
     
        def __init__(self, parent = None):
            super(GraphicsView, self).__init__()
     
            self.setScene(QtGui.QGraphicsScene())
            self.path = QtGui.QPainterPath()
            self.item = GraphicsPathItem()
            self.display_background(filename)
            self.scene().addItem(self.item)
     
        def mousePressEvent(self, event):
            self.start = self.mapToScene(event.pos())
            self.path.moveTo(self.start)
     
        def mouseMoveEvent(self, event):
            self.end = self.mapToScene(event.pos())
            self.path.lineTo(self.end)
            self.start = self.end
            self.item.setPath(self.path)
     
        def display_background(self, filename):
            width, height = self.width(), self.height()
            img = QtGui.QImage(filename)
            # On met l'image à la dimension de la fenêtre
            pixmap = QtGui.QPixmap.fromImage(img.scaled(width, height, 
                                             QtCore.Qt.KeepAspectRatio, 
                                             QtCore.Qt.SmoothTransformation))
     
            self.scene().setSceneRect(0, 0, pixmap.width(), pixmap.height())
            self.scene().addPixmap(pixmap)
     
    class GraphicsPathItem(QtGui.QGraphicsPathItem):
     
        def __init__(self):
            super(GraphicsPathItem, self).__init__()
            pen = QtGui.QPen()
            pen.setColor(QtGui.QColor("red"))
            pen.setWidth(5)
            self.setPen(pen)
     
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        mw = GraphicsView()
        mw.show()
        sys.exit(app.exec_())
    Ne me reste plus qu'à trouver comment sauvegarder l'image et à clean l'image si besoin.

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

Discussions similaires

  1. [DHTML]position de la souris sur une image
    Par Daï2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 18/05/2006, 15h57
  2. Coordonnées de la souris sur une image
    Par renaud26 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/03/2006, 21h11
  3. [Image]Dessiner des rectangles sur une image
    Par navona dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 09/03/2006, 22h51
  4. Réponses: 2
    Dernier message: 28/07/2005, 03h59
  5. coordonnées d'un clic souris sur une image
    Par marcuswgs84 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/01/2005, 19h08

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