【问题标题】:How do I combine a QImage and QPixmap?如何结合 QImage 和 QPixmap?
【发布时间】:2012-10-31 00:59:01
【问题描述】:

我正在使用 PyQt,我已将图像从磁盘加载到 QPixmap。我还创建了一个面具,使用:

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

我想将两者结合起来进行显示,这样当我渲染图像时,遮罩中的任何黑色像素都会在图像上以半透明的红色绘制。

我创建了一个自定义小部件,它在绘制事件中呈现图像,如下所示:

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() 方法返回一个纯白色矩形。

“创建掩码”方法实际上有什么作用吗?

【问题讨论】:

  • 你能举一个完整的例子吗?那个面具是全黑的。
  • 是的,那个面具是全黑的。我有在程序中编辑它的方法。它结合了QImageQPixmap,这给我带来了问题。
  • 你真正想做什么?是为了突出一张图片的某些部分吗?你的面具里到底有什么?你想突出像素的地方是黑色还是其他颜色?
  • 我有一张图片要显示给用户。我希望用户能够在图像上绘制蒙版。有时我想在图像上显示蒙版,这样白色区域是透明的,黑色区域是不透明的。有时我想在图像上显示蒙版,使白色区域是透明的,黑色区域是半透明的红色。

标签: qt pyqt qpainter


【解决方案1】:

要么改变你的面具的设计,要么根据你的面具创建一个新的 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

【讨论】:

    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2012-04-13
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多