2011-09-24 13 views
11

私は透明性とPNGからロード(青)の形状を有する:QPainterでマスクを使用するには?

enter image description here

その後、私はQPainter::drawEllipseと(赤)、この形状の上にいくつかの円を描いています。

enter image description here

その結果は完全に青いを覆う赤形状の第三の画像に幾分類似している:

enter image description here

私は何を希望するが、青色の形状にするためのものです赤いマスクのマスクとして機能し、結果は次のようになります。

enter image description here

QPainterでそれを行うことは可能ですか?

答えて

20

可能です。あなたはQImageのにあなたのPNGをロードしていると仮定すると、あなたのイメージからマスクを作成するには、このような何かを行うことができます。

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を。 –