2011-09-24 16 views
11

que tienen una forma (en azul) cargado desde un PNG con transparencia:¿Cómo usar una máscara con QPainter?

enter image description here

entonces estoy dibujando varios círculos en la parte superior de esta forma (en rojo) con QPainter::drawEllipse.

enter image description here

El resultado de ello es un tanto similar a la tercera imagen con la forma rojo que cubre por completo el azul:

enter image description here

Lo que me gustaría es sin embargo para la forma azul de actuar como una máscara para el rojo, con un resultado como este:

enter image description here

¿Es posible hacer eso con QPainter?

Respuesta

20

Es posible. Suponiendo que está cargando el PNG en un QImage, se puede hacer algo como esto para crear una máscara a partir de su imagen:

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

ver el otro a create*Mask funciones en QImage alternativas.

entonces es una simple cuestión de ajuste de región de recorte del pintor:

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

He aquí una demostración estúpida (no usar ese código y como es, la carga de imágenes, la máscara y la creación región deben almacenarse en caché, que son potencialmente costosa):

#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); 
     } 
}; 

que produce algo como esto: enter image description here

+0

muchas gracias y 1 para el código de ejemplo útil . –

Cuestiones relacionadas