2011-09-24 13 views
11

Saydamlıklı bir PNG'den yüklenen bir şekle (mavi renk) sahibim:QPainter ile maske nasıl kullanılır?

enter image description here

Daha sonra QPainter::drawEllipse ile bu şeklin (kırmızı renkte) üstüne birkaç daire çiziyorum.

enter image description here

Bunun sonucu, mavi olanı tamamen kaplayan kırmızı şekli olan üçüncü resme biraz benzer:

enter image description here

İstediğim şey mavi şekil içindir. Bunun gibi bir sonuç olarak kırmızı bir maske gibi davranın:

enter image description here

QPainter ile bunu yapmak mümkün mü?

cevap

20

Bu mümkün. Bir Qimage halinde PNG yüklüyorlar varsayarsak, sizin görüntüden bir maske oluşturmak için böyle bir şey yapabilirsiniz:

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

alternatifler Qimage içinde create*Mask işlevlerine diğer bakın.

Sonra ressamın kırpma bölgesi ayar basit bir mesele:

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

İşte aptal bir demo (görüntü yükleme, maske ve bölge oluşturma konumlandırılmalıdır gibi-o kodu kullanmayan var, onlar) potansiyel olarak pahalı:

böyle bir şey üretir
#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); 
     } 
}; 

: kullanışlı örnek kod için enter image description here

+0

Teşekkür çok ve +1 . –