2011-09-24 15 views
11

मेरे पास एक पीएनजी से पारदर्शीता के साथ एक आकार (नीला रंग) है:QPainter के साथ एक मुखौटा का उपयोग कैसे करें?

enter image description here

फिर मैं QPainter::drawEllipse के साथ इस आकार (लाल रंग में) के शीर्ष पर कई मंडलियां खींच रहा हूं।

enter image description here

इसका परिणाम तीसरे चित्र के समान है जो लाल आकार को पूरी तरह से नीले रंग से ढंकता है:

enter image description here

मैं क्या चाहता हूं कि नीले आकार के लिए लाल के लिए एक मुखौटा के रूप में कार्य करें, इसके परिणामस्वरूप:

enter image description here

क्या QPainter के साथ ऐसा करना संभव है?

उत्तर

20

यह संभव है। यदि आप एक QImage में अपने पीएनजी लोड कर रहे हैं मान लिया जाये कि, आप अपनी छवि से एक मुखौटा बनाने के लिए कुछ इस तरह कर सकते हैं:

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

विकल्पों की QImage में create*Mask कार्यों के लिए अन्य देखें।

तो यह चित्रकार क्लिप क्षेत्र स्थापित करने का एक सरल बात है:

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

यहाँ एक बेवकूफ डेमो (के रूप में किया जाता है, छवि लोड, मुखौटा और क्षेत्र निर्माण कैश्ड किया जाना चाहिए कि कोड का उपयोग नहीं करते है, वे संभावित महंगे हैं):

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

कौन सा कुछ इस तरह का उत्पादन: उपयोगी नमूना कोड के लिए enter image description here

+0

धन्यवाद एक बहुत और +1 । –

संबंधित मुद्दे