QT:掩盖图像 - 建议?

时间:2013-12-11 06:58:26

标签: qt image-masking

我不知道我是否在这里使用正确的术语。然而,这正是我想要实现的目标,我想就如何实现这一目标提出一些建议。我希望有一个边框可见的圆圈。现在这里是困难的部分,我甚至不知道如何开始。我想以这样的方式操纵圆圈,使得圆圈的边框可见并且其中心不可见(即,它有一个洞并且会显示它下面的任何东西)我想要有放置在圆下的另一图像使得仅显示在圆的透明部分下方的图像部分,圆的透明边界外部的部分变得不可见。关于如何实现这一目标的任何建议。谷歌似乎没有帮助我。

2 个答案:

答案 0 :(得分:4)

我建议使用替代方法来取消屏蔽图像的圆形区域。您可以指定剪辑区域 - 您需要执行绘画的区域。例如:

[..]
QPainter painter(this);
// Sample circular area.
QRegion r(QRect(100, 100, 200, 200), QRegion::Ellipse);
painter.setClipRegion(r);
[..]
painter.drawImage(0, 0, image);
[..]

这将仅绘制图像中半径为200的圆内部分。所有其余像素将被隐藏。 您可以处理鼠标移动事件,将此“圆圈”移动到图像上,就像放大镜一样。

<强>更新

下面是生成带圆形蒙版图像并将其插入标签的示例代码:

QPixmap target(500, 500); // the size may vary
QPixmap source("image.png");

QPainter painter(&target);
QRegion r(QRect(100, 100, 200, 200), QRegion::Ellipse);
painter.setClipRegion(r);
painter.drawPixmap(0, 0, source);

QLabel l;
l.setPixmap(target);
l.show();

答案 1 :(得分:1)

您可能需要查看Composition Example

简而言之,您可以绘制第一张图像,然后使用其中一种合成模式在顶部(或反过来)绘制第二张图像。在使用之前,请务必将图像转换为ARGB32。 要使圆的内部透明,您可以相应地调整Alpha通道。

以下是使用合成模式的小例子:

QPainter p(&imageCircle);
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
p.drawImage(image);
p.end()

在这里,您可以找到QPainter的Qt文档。