平滑圆形面膜.去除锯齿状边缘

Qt : Smooth a circular mask. Remove Jagged edges

本文关键字:锯齿状 边缘 面膜 平滑      更新时间:2023-10-16

我目前正在为我的图像添加一个圆形蒙版。因此,我的图像只显示圆形区域。这工作良好,但图像往往有锯齿状的边缘(边界)。有什么建议吗?

您可以从QPixmap的文档中学习:

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

除了速度慢之外,它们在不支持抗混叠的二进制掩码(QBitmap)上操作,每个像素要么是完全不透明的,要么是完全透明的。这导致了锯齿状的边缘。

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

在原QImage:

中绘制alpha
  1. 确保它实际上有一个alpha通道,例如通过调用img.convertToFormat(QImage::Format_ARGB32);
  2. img上的QPainter初始化为油漆设备
  3. 设置画家的DestinationIn合成模式;看到http://qt project.org/doc/qt - 4.8 -/- qpainter.html # CompositionMode-enum
  4. 用一定alpha值的白色笔刷执行drawEllipse操作。

我认为最简单的方法是:

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是你想要在圆圈中的图像