QT QPainter::antialiasing QPainter::textAntialiasing 反走样、抗锯齿探究
QT中使用QPainter 进行自行绘图的时候,为了防止“锯齿”的出现,我们会经常使用抗锯齿属性,也叫反走样, 既:
QPainter::Antialiasing //绘图抗锯齿
QPainter::TextAntialiasing //绘制的字体抗锯齿
QT 只是和很多系统的绘图API一样,提供了抗锯齿的方法,不过抗锯齿的属性默认都是关闭的,QT也不例外。
为了直观的理解抗锯齿(反走样)的作用。我们先给出效果图:
上面的图中,黑色的字体、直线、与上面的圆,都是没有启用抗锯齿(反走样)的效果的; 下面的红色字体、直线、下面的圆都是启用了抗锯齿(反走样)之后的效果。 可以看出,两幅图的效果差别还是挺大的。
我们先来讲一下有关画法的用法
1.画文字
void drawText(const QPointF &p, const QString &s);
void drawText(const QPoint &p, const QString &s);
void drawText(int x, int y, const QString &s);
void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding);
void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = Q_NULLPTR);
void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR);
void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = Q_NULLPTR);
void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption());
可以看出,画文字,有很多种方法,但是无非就是提供文字的坐标,与文字内容。可以根据自己的场景选用不同的方法。
2.画直线
void drawLine(const QLineF &line);
void drawLine(const QLine &line);
void drawLine(int x1, int y1, int x2, int y2);
void drawLine(const QPoint &p1, const QPoint &p2);
void drawLine(const QPointF &p1, const QPointF &p2);
提供起点、终点的坐标就可以了
3.画椭圆(圆)
void drawEllipse(const QRectF &r);
void drawEllipse(const QRect &r);
void drawEllipse(int x, int y, int w, int h);
void drawEllipse(const QPointF ¢er, qreal rx, qreal ry);
void drawEllipse(const QPoint ¢er, int rx, int ry);
其实这个画椭圆的函数,需要制定椭圆所在的矩形框位置。如果指定的矩形框是正方形,画出来就是圆形,否则就是椭圆。
我们的例子中,就是在paintEvent重绘函数中,就是使用了上面三个函数,分别使用 无抗锯齿(反走样), 抗锯齿(反走样),画出了文字、直线、圆,进行对比。
void MyFrame::paintEvent(QPaintEvent *ev)
{QPainter painter(this);QBrush brush(Qt::red);QBrush brush1(Qt::green);QPen pen(brush1, 5, Qt::DashDotLine, Qt::RoundCap);/**********************未启用抗锯齿功能**************************/painter.setPen(Qt::black);//画字体painter.drawText(QRectF(20, 30, 100, 100), "这是一行文字");//画一条没有启用反锯齿的线painter.drawLine(20, 50, 400, 60);//画一个圆painter.setBrush(brush);painter.setPen(pen);painter.drawEllipse(20, 55, 150, 150);/**********************启用抗锯齿功能**************************/painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);painter.setPen(Qt::red);//画字体painter.drawText(QRectF(20, 280, 100, 100), "这是一行文字");//画一条启用反锯齿的线painter.drawLine(20, 300, 400, 310);//画一个圆painter.setPen(pen);painter.setBrush(brush);painter.drawEllipse(20, 305, 150, 150);
}
我们看到了,是怎样开启抗锯齿(反走样)功能了,就是这句话
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
前面的 Antialiasing 是绘画普通图形启用反走样, TextAntialiasing是绘画文字反走样。
也可以使用下面的函数进行开启抗锯齿(反走样)功能。
painter.setRenderHint(QPainter::Antialiasing, true);
这里设置Antialiasing属性为true,经过这句设置,我们就打开了反走样功能。QPainter和OPengl一样,是一个状态机。因此,我们这里打开了她,之后所有的代码都是开启反走样绘制的了。若要关闭反走样功能:
painter.setRenderHint(QPainter::Antialiasing, false);
到了这里,我们就会发现,反走样的效果要比走样的好得多。那么为什么系统绘图的API(包含QT在内)为什么默认不打开反走样的呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行开启反走样的。为了提高效率,一般的图形绘制,都是默认不开启反走样的。
另外一个特别重要的两个属性:画笔QPen 和 画刷 QBrush
QPen : 用于绘制轮廓线
QBrush: 用于填充
QT QPainter::antialiasing QPainter::textAntialiasing 反走样、抗锯齿探究相关推荐
- 图形学-反走样/抗锯齿
1.反走样 1.1 什么是走样 在上一篇文章中,我们通过采样的方式把一个三角形变成离散的点显示在屏幕上.在采样过程中,我们会产生很多锯齿,这些锯齿的学名就叫做走样 1.2 反走样 如何消除锯齿(走样) ...
- GPU Gems1 - 11 阴影贴图反走样
这章介绍了如何通过邻近百分比过滤方法(Percentage-Closer Filtering , PCF)有效减少阴影贴图的反走样,并描述了如何实现一个简化版本,并对PCF方法进行了一定改进.关于阴影 ...
- 抗锯齿和走样(笔记)
Artifacts(瑕疵): 比如人眼采样频率跟不上陀螺的旋转速度,这时就有可能看到陀螺在反方向旋转 怎么做抗锯齿(滤波): 在采样之前先进行一个模糊操作,可以降低锯齿的明显程度 通过傅里叶定理:任何 ...
- QT学习之QPainter
关于painter绘图 QImage是绘图设备,而QPainter则是画笔,painter(&image)的意思是将图绘制在image上进行显示. image = QImage(w, h, Q ...
- Unity 抗锯齿Antialiasing
直接放到相机上用即可,可以有效降低锯齿(相对于其他插件而言),另外这个脚本跟NatCorder录制视频冲突,具体原因后续再详查. 最近突然发现PC端用Antialiasing修改窗口分辨率时会黑屏,后 ...
- Qt 2D绘图之二:抗锯齿渲染和坐标系统
一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...
- 【Qt】2D绘图之抗锯齿渲染
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 逻辑绘图 04. 物理绘图 05. 抗锯齿绘图 06. 附录 01. 概述 本部分的内容可以在帮助文档中通过Coordin ...
- 计算机图形学【GAMES-101】2、光栅化(反走样、傅里叶变换、卷积)
快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...
- 图形学基础|抗锯齿(Anti-Aliasing)
图形学基础|抗锯齿(Anti-Aliasing) 文章目录 图形学基础|抗锯齿(Anti-Aliasing) 一.前言 二.锯齿 2.1 采样理论 2.2 分类 三.抗锯齿概述 3.1 SSAA(Su ...
最新文章
- Redis缓存使用技巧和设计方案
- 深入理解jQuery的Event机制
- 我的心得:数据中心运维管理(一)
- 关闭Apache的目录浏览功能
- html溢出宽度控制,html - 具有固定宽度列的HTML / CSS表(如果内容溢出,则滚动) - 堆栈内存溢出...
- java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口
- Linux性能优化方向及相关工具
- 书单|互联网企业面试案头书之架构师篇
- 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解
- Linux部分命令使用说明
- python 创建nc文件,包含经纬度
- 如何卸载twincat3_TwinCAT软件安装FAQ
- [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
- uniapp开发hbuilder连接安卓模拟器mumu
- 湖南师范大学学科综合评价计算机,师范类高校自主招生/综合评价相关问答,2020届参考...
- 周末学习总结(LIO标定+kitti数据集的使用+evo工具的使用+开源数据集+ssh的使用)
- C++——计算x的n次幂
- 新买的电脑硬盘如何分区
- linux的系统监视器图片_用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统 - 人工智能遇见磐创...
- antd ellipsis