मेरे पास एक पीएनजी से पारदर्शिता के साथ एक आकृति (नीले रंग में) भरी हुई है:

enter image description here

फिर मैं इस आकृति के ऊपर (लाल रंग में) QPainter::drawEllipse के साथ कई वृत्त बना रहा हूं।

enter image description here

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

enter image description here

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

enter image description here

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

15
laurent 24 सितंबर 2011, 17:15

1 उत्तर

सबसे बढ़िया उत्तर

यह संभव है। मान लें कि आप अपने पीएनजी को 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);
        }
};

जो कुछ इस तरह पैदा करता है: यहां छवि विवरण दर्ज करें

29
Mat 24 सितंबर 2011, 18:03
QRegion में कोई कंस्ट्रक्टर नहीं है जो QPixmap लेता है?
 – 
Paul Knopf
10 पद 2018, 23:57
@PaulKnopf: इसमें एक QBitmap लेता है, और एक QPixmap QBitmap में परिवर्तनीय है।
 – 
Mat
11 पद 2018, 09:40
1
@ पॉल-नॉप: आपको #include <QBitmap> की जरूरत है
 – 
Kaaf
29 मई 2021, 03:21