求教各位QT高手,如何实现抗锯齿的圆形头像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教各位QT高手,如何实现抗锯齿的圆形头像相关的知识,希望对你有一定的参考价值。

参考技术A 参考QT DEMO(Image Composition),采用图片混合透视的方式获得圆形切图。

关键代码:painter.setCompositionMode(QPainter::CompositionMode_SourceOut);

QT提供了多种图片很合方式,经过测试,如果其他项不调整,只有QPainter::CompositionMode_SourceOut这种方式适合。

透视图mask.png,试过中间圆是黑,周边空的,在Image Composition上不能透出圆形图。

示例代码:

QImage getRoundQImage(QSize size/*const QImage& head*/)



QImage resultImage(size,QImage::Format_ARGB32_Premultiplied);

QImage head("user.png");

head = head.scaled(size);

QImage head_mask("mask.png");

QPainter painter(&resultImage);

painter.setCompositionMode(QPainter::CompositionMode_Source);

painter.fillRect(resultImage.rect(), Qt::transparent);

painter.setCompositionMode(QPainter::CompositionMode_SourceOver);

painter.drawImage(0, 0, head_mask);

painter.setCompositionMode(QPainter::CompositionMode_SourceOut);

painter.drawImage(0, 0, head);

painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);

painter.end();

return resultImage;



void getRoundPixmap(QPixmap& src,QSize size)



QImage resultImage(size,QImage::Format_ARGB32_Premultiplied);

QPixmap head_mask("mask.png");

QPainter painter(&resultImage);

painter.setCompositionMode(QPainter::CompositionMode_Source);

painter.fillRect(resultImage.rect(), Qt::transparent);

painter.setCompositionMode(QPainter::CompositionMode_SourceOver);

painter.drawPixmap(0, 0, head_mask);

painter.setCompositionMode(QPainter::CompositionMode_SourceOut);

painter.drawPixmap(0, 0, src.scaled(size));

painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);

painter.end();

src = QPixmap::fromImage(resultImage);

如何在 MATLAB 的 imresize 中实现抗锯齿?

【中文标题】如何在 MATLAB 的 imresize 中实现抗锯齿?【英文标题】:How antialiasing implemented in imresize of MATLAB? 【发布时间】:2022-01-10 22:42:49 【问题描述】:

我注意到imresize的抗锯齿是这样实现的(contributions.m, line 12-13):

h = @(x) scale * kernel(scale * x);
kernel_width = kernel_width / scale;

这是核函数的缩放输入和输出,也是扩展核宽度,虽然它似乎有一些直观的方面,例如根据比例扩展核宽度。但是这个公式是如何显式推导的让我很困惑,谁能详细解释一下这些代码背后的原理?

【问题讨论】:

【参考方案1】:

他们在https://blogs.mathworks.com/steve/2017/01/16/aliasing-and-image-resizing-part-3/做了一点解释。

如果您看一下,他们会通过一个信号重采样示例对其进行解释。但它们也显示了图像示例和用于插值的内核图形。内核是三次插值,用于将图像修改为新的所需大小。但是,如果您想使用较小的尺寸,那么他们会使用新尺寸和先前尺寸(比例变量)的关系来修改三次插值。

h = @(x) scale * kernel(scale * x);

这个修改使得三次插值的峰值更小,宽度更大,所以使用它来存储宽度的值以备后用。由于比例是 if 条件来确保它永远不会 > 1)宽度扩展得更多。

kernel_width = kernel_width / scale;

随着宽度变大,他们使用更多像素来计算每个输出像素(这对缩小图像很有意义)。

% What is the maximum number of pixels that can be involved in the
% computation?  Note: it's OK to use an extra pixel here; if the
% corresponding weights are all zero, it will be eliminated at the end
% of this function.
P = ceil(kernel_width) + 2;

【讨论】:

是的,链接似乎是正确的答案,我阅读了作者在最后提到的论文“General Filtered Image Rescaling”。对我来说,这些操作更像是启发式方法。谢谢!

以上是关于求教各位QT高手,如何实现抗锯齿的圆形头像的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Emscripten 激活抗锯齿

我的OpenGL学习进阶之旅收集到的关于如何在OpenGL ES上使用MSAA(Multisample Anti-aliasing)实现抗锯齿效果的资料和源码

Qt 圆角头像的实现

如何在 MATLAB 的 imresize 中实现抗锯齿?

如何在没有抗锯齿的情况下拉伸图像

android 如何重写imageview 让图片有圆角效果