2012-10-31 66 views
0

我正在使用PyQt,並且我從磁盤加載了一個圖像到QPixmap。我還創建了一個面罩,使用:如何組合QImage和QPixmap?

self.mask = QImage(self.image.width(), self.image.height(), QImage.Format_Mono) 
self.mask.fill(0) 

我想這兩個顯示在圖像上,當我使之結合,使得在面具染成黑色的任何像素在半透明的紅色繪製。

我創建了一個自定義的widget,呈現圖像中的油漆事件,像這樣:

def paintEvent(self, event): 
    p = QPainter(self) 
    r = event.rect() 

    p.drawPixmap(r, self.image, r) 

這工作得很好。我不太清楚的是如何獲取遮罩中的數據,並僅在目標圖像中的像素上繪製半透明的紅色。

我試着打開面罩進入裁剪區域,像這樣:

mask = QPixmap.fromImage(self.mask.createMaskFromColor(self.mask.color(0))) 
p.setClipRegion(QRegion(mask)) 

color = QColor(255, 0, 0, 128) 
p.setPen(Qt.NoPen) 
p.setBrush(QBrush(color)) 
p.drawRect(r) 

...但它不畫任何東西(及以上,如果我不整個圖像繪製一個半透明的紅色方框別叫setClipRegion)。

我也嘗試創建遮罩作爲QImage.Format_ARGB4444_Premultiplied,並使用透明度。雖然這確實起作用,並且我可以在程序中編輯蒙版(並驗證蒙版的某些部分是透明的,而某些部分是不透明的),但self.mask.createAlphaMask()方法會返回一個純白色的矩形。

做了「創建面具」其實方法做什麼?

+0

你能舉一個完整的例子嗎?那面膜是全黑的。 – Avaris

+0

是的,那面膜是全黑的。我有辦法在程序中編輯它。它結合了'QImage'和'QPixmap',這對我造成了問題。 –

+0

你真的想做什麼?是否突出顯示一個圖像的某些部分?你的面具真的是什麼?它是黑色的,你想突出像素或其他顏色? – Uflex

回答

2

要麼改變你的面具的設計或根據你的面具創建一個新的QImage。然後在目標上繪製QImage。它不僅是一種有效的方法,而且是一種比繪製單個像素或某物更快的方法。類似。我嘗試了幾種方法,這是迄今爲止最快的(在QGLWidget上)。

的想法是,你編碼的透明度,也非標像素,在QImage的直接,就像這樣:

QImage dest(<width>, <height>, QImage::Format_ARGB32); 
dest.fill(qRgba(0, 0, 0, 0)); 
for (int y = 0; y < <height>; ++y) { 
    QRgb *destrow = (QRgb*)dest.scanLine(y); 
    for (int x = 0; x < <width>; ++x) { 
     if (<should be marked>) 
      destrow[x] = qRgba(255, 0, 0, 127); 
    } 
} 
painter.drawImage(0, 0, dest); 

作爲參考,看看這裏的代碼:

https://sourceforge.net/p/gerbil/svn/60/tree/trunk/gerbil-gui/bandview.cpp#l59