我正在使用PyQt,我已经将磁盘中的图像加载到QPixmap
。我还创建了一个面具,使用:
self.mask = QImage(self.image.width(), self.image.height(), QImage.Format_Mono)
self.mask.fill(0)
我想将两者合并用于显示,这样当我渲染时,蒙版中黑色的任何像素都会以半透明的红色绘制。
我创建了一个自定义窗口小部件,它在paint事件中呈现图像,如下所示:
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 :(得分: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