2011-09-24 68 views
11

Tôi có một hình dạng (màu xanh lam) đã tải từ một PNG với tính minh bạch:Cách sử dụng mặt nạ với QPainter?

enter image description here

Sau đó, tôi đang vẽ một vài vòng tròn trên đầu trang của hình này (màu đỏ) với QPainter::drawEllipse.

enter image description here

Kết quả của việc đó là hơi tương tự như bức tranh thứ ba với hình dạng màu đỏ hoàn toàn bao phủ một màu xanh:

enter image description here

gì tuy nhiên tôi muốn là cho hình dạng màu xanh để hoạt động như mặt nạ cho màu đỏ, với kết quả như sau:

enter image description here

Có thể thực hiện điều đó với QPainter không?

Trả lời

20

Có thể. Giả sử bạn đang tải PNG của bạn thành một QImage, bạn có thể làm một cái gì đó như thế này để tạo ra một mặt nạ từ hình ảnh của bạn:

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

Xem các khác để create*Mask chức năng trong QImage giải pháp thay thế.

Sau đó, nó là một vấn đề đơn giản của thiết lập vùng clip của họa sĩ:

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

Dưới đây là một bản demo ngu ngốc (không sử dụng mã như-là, tải hình ảnh, mặt nạ và tạo khu vực nên được lưu trữ, họ có khả năng đắt tiền):

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

nào tạo ra một cái gì đó như thế này: enter image description here

+0

Cảm ơn rất nhiều và +1 cho mã mẫu hữu ích . –

Các vấn đề liên quan