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 :

[QGraphicsPixmapItem] Afficher une image en mode de fusion produit


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 0
    Points
    0
    Par défaut [QGraphicsPixmapItem] Afficher une image en mode de fusion produit
    Hello,

    J'aimerai afficher une image sur mon app QT, en utilisant un mode de fusion en produit, tout comme sous photoshop, est ce possible ?
    Sinon, l'autre solution qui m'irait tout aussi bien serait d'utiliser une seconde image en niveaux de gris comme un alpha, ile me semble qu'on peut faire ça avec QGraphicsPixmapItem mais je ne trouve pas de doc apropriée.

    Toute aide est la bienvenue, merci !

    Blob

  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,

    Il y a un cours ici sur l'usage des QGraphicsPixmapItem.

    Pour les manipulations que tu recherches, tu peux utiliser les modes de composition de QPainter

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    QPainter.CompositionMode_Multiply

    Fabuleux En faite il ya tous les modes dont je puisse rêver. Merci beaucoup : )

    Blob

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    Un petit problème d'utilisation,

    J'ai écris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     self.painter = QtGui.QPainter(self)
            self.painter.begin(self)
            self.painter.drawPixmap(0, 0, 1024, 768, (QPixmap("ScanlineFilter.png")))
            self.painter.setCompositionMode(QPainter.CompositionMode_Multiply)
            self.painter.end()
    Mais ca me retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QPainter::begin: Paint device returned engine == 0, type: 1
    QPainter::setCompositionMode: Painter not active
    Malgré mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.painter.begin(self)

  5. #5
    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
    Le QPainter est simplement un outil, tu dois d'abord créer le support où appliquer cet outil et ce support doit être désigné avec QPainter.begin(support)

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            # On crée le support en ARGB premultiplied pour des raisons de performances
            background = QtGui.QImage(QSize(1024, 768), QtGui.QImage.Format_ARGB32_Premultiplied)
            # Il *FAUT* le remplir (ici transparent)
            background.fill(QtGui.QColor(0, 0, 0, 0))
            painter = QtGui.QPainter()
            # On dit au painter où il s'applique
            painter.begin(background)
            painter.drawPixmap(0, 0, 1024, 768, (QtGui.QPixmap("ScanlineFilter.png")))
            painter.setCompositionMode(QtGui.QPainter.CompositionMode_Multiply)
            painter.end()
     
            # l'image finale est le background et pas le painter
            return background
    Ici le mode composition n'a pas d'effet puisqu'il n'y a qu'une seule image (le support est transparent) mais tu pourras l'utiliser pour peindre d'autres images sur la première.

    Faudra surement tester les différents modes pour obtenir ce que tu veux.

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    hello, ça a l'aire de fonctionner un peut mieux, mais c'est toujours pas ça :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    background = QtGui.QImage(QSize(1024, 768), QtGui.QImage.Format_ARGB32_Premultiplied)       
            background.fill(QtGui.QColor(0, 0, 0, 0))
            self.painter = QtGui.QPainter(self)
            self.painter.begin(background)
            self.painter.drawPixmap(0, 0, 1024, 768, (QPixmap("ScanlineFilter.png")))
            self.painter.setCompositionMode(QPainter.CompositionMode_Multiply)
            self.painter.end()
    return :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QPainter::begin: Paint device returned engine == 0, type: 1
    donc ici cette image sera en multiply uniquement sur ce que je set en background (?), je cherche à l'appliquer en multiply sur l'ensemble de mon app :/


    EDIT :

    j'ai fait quelques changements et plus d'erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    background = QtGui.QImage(QSize(1024, 768), QtGui.QImage.Format_ARGB32_Premultiplied)
            background.fill(QtGui.QColor(0, 0, 0, 0))
            painter = QtGui.QPainter()
            painter.begin(background)
            painter.drawPixmap(0, 0, 1024, 768, (QPixmap("ScanlineFilter.png")))
            painter.setCompositionMode(QPainter.CompositionMode_Multiply)
            painter.end()
    cela dit l'image est completement invisible en effet. est ce parce que mon png n'as d'effet que sur ce que je passe dans le "background", auquel cas il faut que je trouve une autre solution, ou simplement une histoire de reglage ?

    Merci !

  7. #7
    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
    donc ici cette image sera en multiply uniquement sur ce que je set en background (?), je cherche à l'appliquer en multiply sur l'ensemble de mon app :/
    Sur quoi affiche-tu ton image ? Sur un widget ?

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    J'ai une QMainWindow avec plusieurs Qdockwidget et plusieur Qlabel avec des pixmap positionnés un peut partout, c'est au dessu de l'enssemble que je cherche a multiplier ce png.

  9. #9
    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
    Ouf, ça y en a pas possible.


    Le painter ne peut être utilisé sur un widget que lors d'un paintEvent de ce widget et non pas sur plusieurs widgets ni n'importe quand.

    Et tu veux "fusionner" les couleurs en plus ...

    Regarde cet exemple:
    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
     
    # -*- coding: utf-8 -*-
     
    import sys
     
    from PyQt4 import QtCore, QtGui
     
    class Main(QtGui.QMainWindow):
        def __init__(self):
            super(Main, self).__init__()
            # J'ai choisis la taille de l'image
            self.resize(300, 150)
            self.cw = QtGui.QWidget(self)
            layout = QtGui.QVBoxLayout(self.cw)
            self.btn = QtGui.QPushButton(self)
            self.btn1 = QtGui.QPushButton(self)
            layout.addWidget(self.btn)
            layout.addWidget(self.btn1)
            self.setCentralWidget(self.cw)
            self.cw.paintEvent = self.paint_event
     
        def paint_event(self, event):
            painter = QtGui.QPainter()
            painter.begin(self.cw)
            painter.drawPixmap(0, 0, 300, 150, QtGui.QPixmap('summer.jpg'))
            painter.end()
     
    if __name__ == '__main__':
        app = QtGui.QApplication([])
        main = Main()
        main.show()
        sys.exit(app.exec_())
    Nom : mwindow.png
Affichages : 529
Taille : 35,4 Ko

    Ensuite pour chaque widget, il te faudra faire pareil, je crains que ce ne soit beaucoup de travail juste pour un effet.

    Il vaudrait mieux réfléchir à un widget qui recouvre le tout avec une style sheet pour le rendre transparent et sur lequel tu peins ton image.
    Ceci pour le central widget, les dock widgets devront être traités séparément.

  10. #10
    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
    Ça 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
     
    # -*- coding: utf-8 -*-
     
    import sys
     
    from PyQt4 import QtCore, QtGui
     
    class Main(QtGui.QMainWindow):
        def __init__(self):
            super(Main, self).__init__()
            # J'ai choisis la taille de l'image
            self.resize(300, 150)
            self.cw = QtGui.QWidget(self)
            layout = QtGui.QVBoxLayout(self.cw)
            self.btn = QtGui.QPushButton(self)
            self.btn1 = QtGui.QPushButton(self)
            layout.addWidget(self.btn)
            layout.addWidget(self.btn1)
            self.setCentralWidget(self.cw)
            self.frame = QtGui.QFrame(self.cw)
            self.frame.paintEvent = self.paint_event
     
        def paint_event(self, event):
            w, h = self.size().width(), self.size().height()
            self.frame.setMinimumSize(w, h)
            painter = QtGui.QPainter()
            painter.begin(self.frame)
            # Il faut paramétrer le mode avant de peindre
            painter.setCompositionMode(QtGui.QPainter.CompositionMode_Multiply)
            painter.drawPixmap(0, 0, w, h, QtGui.QPixmap('summer.jpg'))
            painter.end()
     
    if __name__ == '__main__':
        app = QtGui.QApplication([])
        main = Main()
        main.show()
        sys.exit(app.exec_())
    ...malheureusement les widgets deviennent inactifs.

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2014
    Messages : 23
    Points : 0
    Points
    0
    Par défaut
    humhum je vais éssayer, merci beaucoup pour ton aide : )

    Aussi, je me demande si il n'ya pas moyen de simplement faire un render de la fenètre, prendre tous les pixels affichés dans mon app et en faire une pixmap, x fois par secondes, et d'apliquer mon effet sur le-dit render. Mais bon si c'est faisable j'imagine que ce sera super lourd et pas expoitable de toute fasson :B

Discussions similaires

  1. Lire une image en mode binaire et l'afficher
    Par regisyves dans le forum ASP.NET
    Réponses: 1
    Dernier message: 05/03/2013, 13h42
  2. Afficher une image JPG qui se trouve dans une bdd
    Par Harry dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/02/2004, 10h51
  3. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59
  4. Réponses: 2
    Dernier message: 04/02/2004, 22h32
  5. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 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