如何绘制暗化的QPixmap?

3

我正在寻找一种快速有效的方法,可以使用QPainter绘制QPixmap,并使得该pixmap比正常情况下更暗。是否有某种过滤器或效果,可以应用于绘制时的QPixmap或QPainter,以创建此效果?


1
你可以在代码中生成一个黑色或灰色的第二个像素图,它与你想要绘制的像素图大小完全相同,然后只需玩弄这个暗像素图的 alpha 值来充当“过滤器”。确保这个次要像素图显然是在顶部绘制的。 - Developer Paul
2个回答

6

QPixmap 中,您无法访问像素,因此不可能遍历像素并使它们变暗。

但是,您可以使用透明黑色画刷填充 QPixmap,并使用多种合成模式来进一步自定义结果。

    QPainter painter(this);
    QPixmap pm("d:/test.jpg");
    painter.drawPixmap(QRect(0, 0, 400, 200), pm);
    painter.translate(0, 200);
    painter.drawPixmap(QRect(0, 0, 400, 200), pm);
    painter.fillRect(QRect(0, 0, 400, 200), QBrush(QColor(0, 0, 0, 200)));

enter image description here


使用光栅后端,QPixmapQImage 的一个非常薄的包装器。将像素图转换为图像基本上是无操作 :) - Kuba hasn't forgotten Monica
@KubaOber 我不确定这是正确的,在光栅后端,QImage 比 QPixmap 明显慢。我在 Windows 和 Linux 上进行了测试。如果我没记错,pixmap 使用平台特定的实现,而 image 是 Qt 自己的通用实现。 - dtech
这已经不是十年前的事了。Pixmap根本不使用任何特定于平台的东西。当QImage具有较不高效的绘制格式时,它只比Pixmap慢。 - Kuba hasn't forgotten Monica
这是可能的,我在 Qt 5 发布之前进行过测试,那已经接近十年了。大约七年左右吧。 - dtech
很遗憾,我需要使一个不完全矩形的QPixmap变暗。它是一个独特的形状。我该如何只变暗那一部分? - Griffort
1
@Griffort,不存在非矩形像素图的概念。你所说的是它的视觉表示不是矩形的。在这种情况下,它取决于该表示如何定义 - 如果它是一个alpha通道,你可以使用自定义合成模式。否则,你将不得不使用预定义的模板,这实质上是一个带有alpha通道的黑色图像,将其剪切成所需的形状。 - dtech

2

一些早期的评论会在您的屏幕上留下一个深灰色的矩形。使用合成模式,会使所有可见的东西变暗,但透明区域仍然保持透明。

原始答案:最初的回答

painter.setCompositionMode (QPainter::CompositionMode_DestinationIn);
painter.fillRect (rect, QBrush (QColor (0,0,0,128)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接