Qt:平滑圆形面罩。去除锯齿状边缘

时间:2014-03-11 19:53:53

标签: c++ qt qpainter

我目前正在执行以下操作,在我的图像上放置一个圆形遮罩。因此,只显示我图像的圆形区域。这样可以正常工作,但图像往往有锯齿状边缘(边框)。关于如何做到这一点的任何建议。

2 个答案:

答案 0 :(得分:4)

从QPixmap的文档中,您可以了解到:

  

hasAlpha(),setMask()和mask()函数是遗留的,不应使用。它们可能非常慢。

除了速度慢之外,它们还使用不支持抗锯齿的二进制掩码(QBitmap),每个像素都是完全不透明或完全透明的。这会导致锯齿状边缘。

解决方案是直接操作像素图的alpha通道。但是,您不能在像素图上使用绘图操作。相反,您需要在通过QPixmap::fromImage()转换之前绘制QImage 。 使用此方法,您操作的Alpha通道具有8位(而不是1位),允许进行抗锯齿处理。在边缘处,您会发现完全不透明和完全透明之间的平滑过渡。

所以在原始QImage中绘制alpha:

  1. 确保它实际上有一个alpha通道,例如致电img.convertToFormat(QImage::Format_ARGB32);
  2. QPainter上初始化img作为绘图设备
  3. 在画家上设置DestinationIn构图模式;见http://qt-project.org/doc/qt-4.8/qpainter.html#CompositionMode-enum
  4. 使用某个alpha的白色笔刷执行drawEllipse操作。

答案 1 :(得分:0)

我认为最简单的方法是:

oImage.convertToFormat(QImage::Format_ARGB32);
QImage oCircleProfileImage (oImage.width(), oImage.height(), QImage::Format_ARGB32);
oCircleProfileImage.fill(Qt::transparent);
QBrush oImageBrush(oImage);
QPainter oPainter(&oCircleProfileImage);
oPainter.setBrush(oImageBrush);
oPainter.setPen(Qt::NoPen);
oPainter.setRenderHint(QPainter::Antialiasing);
oPainter.drawEllipse(0, 0, oImage.width(), oImage.height());

其中 oImage 是您想要在圆圈中的图像。