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 :

[PyQt] découper ou superposer des images Qpixmap


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [PyQt] découper ou superposer des images Qpixmap
    Bonjour,

    Je découvre le gestionnaire de fenêtres en Python PyQT. J'ai trouvé dans les fils de discussions passés de ce forum pas mal d'indications qui m'ont permis de débuter en PyQt un afficheur de carte OpenStreetMap à la manière d'un gps. Cela m'a incité à m'inscrire. Ces cartes sont constitués de fichiers tuiles *.png de 256 x 256 pixels. J'arrive à les afficher cote-à-cote pour construire une plus grande carte... La partie centrale de l'affichage est dans la fonction buildMap.

    Je n'arrive pas à trouver la méthode qui permet de placer une image QPixmap sous une autre pour qu'elle soit partiellement recouverte par une autre QPixmap.

    Je rencontre ce besoin par exemple lorsqu'il manque une tuile d'un certain niveau, elle peut être approchée par la tuile correspondante d'un niveau immédiatement inférieur avec un zoom "x2". Il en est de même pour peindre en gris un morceau de tuile pour n'en faire ressortir qu'une partie à l'écran.

    Voilà donc la partie centrale du "code qui marche".

    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
     
     
    class MaFenetre (QWidget) : 
     
      # initialisation des variables...
     
      def buildMap (self):    
     
        for xx in range (xcentre-3, xcentre+3) :
          for yy in range (ycentre-2, ycentre+2) :
     
            # affichage d'une carte de taille 7x5 tuiles
            image = QLabel ("", self)
            pixmap = QPixmap (nom(self.level,xx,yy)) # lit la tuile par exemple .../12/123/456.png
            image.setPixmap(pixmap)
            image.move((xx-xcentre)*256, (yy-ycentre)*256
            image.show()
     
      def keyPressEvent (self, e):
            if e.key() == QtCore.Qt.Key_Escape : self.close()
            elif e.key() == QtCore.Qt.Key_Z : 
              if self.level < 18 : self.level += 1 
              else : return 
            elif e.key() == QtCore.Qt.Key_A : 
              if self.level > 0 : self.level -= 1
              else : return 
            elif e.key() == QtCore.Qt.Key_M: 
              self.long += 360/2**self.level
              if self.long > 180 : self.long -= 360
            elif e.key() == QtCore.Qt.Key_K:
              self.long -= 360/2**self.level
              if self.long < -180 : self.long += 360
            elif e.key() == QtCore.Qt.Key_O:
              self.lat += 180/2**self.level
              if self.lat > 90 : self.lat = 89
            elif e.key() == QtCore.Qt.Key_L: 
              self.lat -= 180/2**self.level
              if self.lat < -90 : self.lat = -89
            else:
              print('bad key !')
              return 
     
            self.buildMap()
     
      def __init__ (self,long,lat,level) :
        self.level = level
        self.long  = long
        self.lat   = lat
        QWidget.__init__(self)
        self.setMinimumSize(100, 100)
        self.buildMap()
     
    def main () :
      app = QApplication.instance () 
      if not app : app = QApplication(sys.argv)
      fenetre = MaFenetre (long  = -2, lat = 48, level = 6)
      fenetre.show ()
      app.exec_()
     
    main()
    Je réussis aussi à créer des rectangles de couleurs, mais je n'arrive pas à les placer "au dessus" d'une carte déjà dessinée pour en masquer une partie, même en permutant l'ordre des méthodes .show().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            qp = QPixmap (70, 256) # pour créer un rectangle de 70x256 pixels
            qp.fill (Qt.gray)
            ig = QLabel ("gris", self)
            ig.setPixmap (qp)
            ig.show()
    Par ailleurs, la bibliothèque de manipulations d'images PIL permet de créer des images "déjà découpées" par la méthode .crop, et de traiter des pixels un par un, mais je n'ai pas trouvé de moulinette qui transforme un Qpixmap en image pour PIL et réciproquement.

    Je demande donc à bien plus savant que moi s'il possible de "découper" ou de "recouvrir" des morceaux d'images QPixmap, ou d'indiquer les pistes habituellement retenues pour résoudre ce problème.

    Bien cordialement à tous, et un grand merci à ceux qui m'aideront à avancer !

    F.

  2. #2
    Expert éminent

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

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

    Le problème est que tu utilises des QLabel ce n'est donc pas: Comment agencer des QImage mais plutôt des QLabel.

    Les QLabel ne sont vraiment pas fait pour cela, à réserver pour placer un logo, une illustration quelconque mais pas pour dessiner.

    Ici tu as un tuto pour l'emploi du QGraphicsView qui, lui, est vraiment destiné au graphisme, tu pourras recouvrir ou peindre sur tes tuiles à ta guise.
    Ce tuto est pour PyQt4 mais très peu de choses diffèrent avec PyQt5 (Je planche sur une mise à jour).

    À tout hasard tu as ici aussi un code complet d'une visionneuse de carte openStreeMap dans une fenêtre web, toujours avec PyQt5.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Je suis de retour en reprenant le tutorial minimal de PyQt.
    J'ai donc créé la partie principale de l'écran self.vue par QGraphicsView qui contiendra cote à cote les tuiles osm : des fichiers *.png de 256x256 pixels.

    J'arrive à créer un QLabel qui contient la bonne tuile osm dans cette fenêtre principale, mais je n'arrive pas à poser directement cette image dans la fenêtre.
    Il n'y a pas de méthode self.vue.setPixmap (...) ni addPixmap, et ces méthodes ne s'appliquent pas non plus à self.centralwidget.

    Je ne trouve pas les primitives qui permettent de manipuler les pixels (ou les images) de la fenêtre self.vue.

    Que n'ai-je pas compris ? ou de quel côté dois-je chercher ?

    Bien cordialement à tous !

    F.

    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
    import sys 
    import os 
     
    from PyQt4 import QtCore, QtGui 
     
    class ImageViewer(object): 
     
        def setupUi(self, Viewer): 
            Viewer.resize(640, 480) 
            Viewer.setWindowTitle(u"Exemples d'usage d'images") 	
            self.centralwidget = QtGui.QWidget(Viewer) 
            self.gridLayout = QtGui.QGridLayout(self.centralwidget) 
            self.verticalLayout = QtGui.QVBoxLayout() 
            self.vue = QtGui.QGraphicsView(self.centralwidget)    # création de la partie centrale de l'écran
            self.verticalLayout.addWidget(self.vue) 
            self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) 
     
            self.image = "3/1/3.png" 
     
            self.label = QtGui.QLabel(self.vue) 
            self.label.setPixmap(QtGui.QPixmap(self.image)) 
    #        self.vue                  sans méthode setPixmap ni addPixmap
    #        self.centralwidget    sans méthode setPixmap ni addPixmap
     
            Viewer.setCentralWidget(self.centralwidget) 
     
            # Connections
     
     
    if __name__ == "__main__": 
        app = QtGui.QApplication(sys.argv) 
        Viewer = QtGui.QMainWindow() 
        ui = ImageViewer() 
        ui.setupUi(Viewer) 
        Viewer.show() 	
        sys.exit(app.exec_())

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Il ne faut plus utiliser de label mais une scène, c'est elle qui permet toutes les opérations graphiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            self.scene = QGraphicsScene()
            self.vue.setScene(self.scene)
            self.tile_1 = QPixmap("3/1/3.png")
            self.scene.addPixmap(self.tile_1)
    https://doc.qt.io/qt-5/qgraphicsscene.html

Discussions similaires

  1. Superposer des images.
    Par T-O-N-Y dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/02/2007, 14h12
  2. [VB.NET] Comment superposer des images ?
    Par zetta dans le forum ASP.NET
    Réponses: 1
    Dernier message: 16/10/2006, 14h41
  3. [VB6]Superposer des images pour en faire qu'une seule
    Par spikto dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/08/2006, 15h49
  4. [LG] Superposer des images
    Par biker dans le forum Langage
    Réponses: 1
    Dernier message: 29/01/2006, 19h22
  5. [Image]Alternative à GD pour superposer des images
    Par Invité4 dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 14/01/2006, 19h13

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