2011-09-24 15 views
11

Ho una forma (in blu) caricato da un PNG con trasparenza:Come utilizzare una maschera con QPainter?

enter image description here

Poi sto disegnando diversi circoli in cima a questa forma (in rosso) con QPainter::drawEllipse.

enter image description here

Il risultato di ciò è in qualche modo simile alla terza immagine con la forma rossa che copre completamente quello blu:

enter image description here

Quello che vorrei, tuttavia, è per la forma blu agire come una maschera al rosso, con un risultato come questo:

enter image description here

È possibile farlo con QPainter?

risposta

20

È possibile. Supponendo che si sta caricando il PNG in un QImage, si può fare qualcosa di simile per creare una maschera dall'immagine:

QImage img("your.png"); 
QPixmap mask = QPixmap::fromImage(img.createAlphaMask()); 

vedere l'altro per create*Mask funzioni in QImage di alternative.

allora è una semplice questione di impostazione area di visualizzazione del pittore:

QPainter p(this); 
p.setClipRegion(QRegion(mask)); 

Ecco una demo stupido (non utilizzare quel codice così com'è, il caricamento delle immagini, la maschera e la creazione regione dovrebbero essere memorizzati nella cache, sono potenzialmente costosi):

#include <QtGui> 

class W: public QWidget 
{ 
    Q_OBJECT 
    public: 
     W(): QWidget(0) { } 

    protected: 
     void paintEvent(QPaintEvent *) 
     { 
      QPainter p(this); 
      QImage img("../back.png"); 
      QPixmap mask = QPixmap::fromImage(img.createAlphaMask()); 

      // draw the original image on the right 
      p.drawImage(300, 0, img); 

      // draw some ellipses in the middle 
      p.setBrush(Qt::red); 
      for (int i=0; i<100; i+=10) 
       p.drawEllipse(i+150, i, 20, 70); 

      // and do the same thing, but with the mask active 
      p.setClipRegion(QRegion(mask)); 
      for (int i=0; i<100; i+=10) 
       p.drawEllipse(i, i, 20, 70); 
     } 
}; 

che produce qualcosa di simile: enter image description here

+0

Grazie mille e uno per il codice di esempio utile . –

Problemi correlati