平滑圆形面膜.去除锯齿状边缘
Qt : Smooth a circular mask. Remove Jagged edges
我目前正在为我的图像添加一个圆形蒙版。因此,我的图像只显示圆形区域。这工作良好,但图像往往有锯齿状的边缘(边界)。有什么建议吗?
您可以从QPixmap的文档中学习:
hasAlpha(), setMask()和mask()函数是遗留的,不应该使用。它们可能非常慢。
除了速度慢之外,它们在不支持抗混叠的二进制掩码(QBitmap
)上操作,每个像素要么是完全不透明的,要么是完全透明的。这导致了锯齿状的边缘。
解决方案是直接操作像素图的alpha通道。但是,您不能在像素图上使用绘图操作。相反,您需要在通过QPixmap::fromImage()
转换之前绘制QImage 。使用这种方法,您操作的alpha通道有8位(而不是1位),这允许抗锯齿。在边缘,你会发现在完全不透明和完全透明之间有一个平滑的过渡。
在原QImage:
中绘制alpha- 确保它实际上有一个alpha通道,例如通过调用
img.convertToFormat(QImage::Format_ARGB32);
- 将
img
上的QPainter
初始化为油漆设备 - 设置画家的
DestinationIn
合成模式;看到http://qt project.org/doc/qt - 4.8 -/- qpainter.html # CompositionMode-enum - 用一定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是你想要在圆圈中的图像
相关文章:
- 宽度为奇数的16位纹理为片状
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 如何获取边缘窗口句柄 (HWND)?
- 如何解析表示树状数据结构的字符串
- 提升如何在图形可视化中写入边缘的权重?
- 在 c++ 中使用 Tensorflow Lite 在边缘 TPU 上运行"mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite"时出现问题
- 分数背包边缘箱
- 将文本文件解析为树状数据结构
- 应用程序无法找到铬边缘浏览器
- MFC 中的抗锯齿
- 从锯齿状数组读取
- 问题创建和返回锯齿状阵列(错误std :: bad_array_new_length)
- SFML在Pong Clone(OS X)中进行一些锯齿状的性能
- c#中的c++锯齿状数组切片
- 多种类型的锯齿状阵列
- 直接X 11锯齿状边缘
- 类的锯齿状数组
- 如何在SWIG中将矢量的锯齿状C++向量转换为Python
- 多维锯齿状地图
- 平滑圆形面膜.去除锯齿状边缘