你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第26章 抗锯齿基础介绍

[复制链接]
baiyongbin2009 发布时间:2015-2-6 16:54
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第26章      抗锯齿基础介绍

    本期教程主要是跟大家讲解一下抗锯齿,关于抗锯齿,在第16章讲解字体显示的时候也讲了点。本期教程就是跟大家详细的讲解一下抗锯齿方面的知识。
     线条由一系列必须位于显示坐标处的像素近似构成。因此,可能看起来呈锯齿状,尤其是近似水平线或近似垂直线。这种现象称为锯齿(aliasing)。抗锯齿是对线条和曲线进行平滑处理。可以减少不完全水平或垂直的线条的楼梯状锯齿。STemWin支持不同的抗锯齿质量、无锯齿字体和高分辨率坐标。
    26. 1  介绍
    26. 2 抗锯齿API函数实例演示
    26. 3 总结
26.1  介绍
    抗锯齿通过使背景色与前景色相“混合”的方法来平滑曲线和对角线。背景色与前景色之间使用的阴影越多,抗锯齿效果越好 (计算时间越长)。
26.1.1      抗锯齿质量
    抗锯齿处理的质量由GUI_AA_SetFactor()函数设定,通过下面的截图给大家介绍一下抗锯齿因子与对应结果之间的关系。
26.1.png

    第一条线未经抗锯齿处理(因子1)。第二条线以因子2进行了抗锯齿处理。也就是说,从前景到背景的阴影数为2 x 2 = 4。下一条线以抗锯齿因子3绘制,因而有3 x 3 = 9个阴影,如此等等,不一而足。因子4足以处理多数应用。进一步增加抗锯齿因素不会大幅改善结果,但会增加计算时间。
26.1.2      抗锯齿字体
    在前面第16章介绍字体的时候讲解过2bpp和4bpp字体显示效果,下面再给大家展示下不使用抗锯齿和使用两种抗锯齿下字母C的显示效果:

    26.2.png
    无锯齿字体可以通过STemWin字体转换器创建。使用无锯齿字体的一般目的是改进文字的外观。虽然高质量抗锯齿比低质量搞锯齿处理看起来更好美观,但计算时间和存储器占用量也会相应增加。低质量(2bpp)字体需要两倍于无抗锯齿处理(1bpp)字体的存储器容量;高质量(4bpp)字体则需要四倍的存储器容量。
26.1.3      高分辨率坐标
    在使用抗锯齿法绘制项目时,使用的是与常规 (无抗锯齿处理)绘图程序相同的坐标。这是默认模式。在函数参数中无需考虑抗锯齿因子。例如,要从(50, 100)到(100, 50)绘制一条抗锯齿线条,则需写入以下代码:
       GUI_AA_DrawLine(50, 100, 100, 50);
    借助STemWin的高分辨率功能,大家可以使用取决于抗锯齿因子和显示尺寸的虚拟空间。使用高分辨率坐标的优势在于,项目不但可以置于显示器的物理位置上,而且可以置于物理位置之间。
    下图展示的是一个高分辨率像素的虚拟空间,其抗锯齿因素为3:
26.3.png

     以抗锯齿因子3,从像素(50,100)到像素(100, 50)绘制一条高分辨率线条,则需写入以下代码:
        GUI_AA_DrawLine(150, 300, 300, 150);
     高分辨率坐标必须通过GUI_AA_EnableHiRes()程序启用,并用GUI_AA_DisableHiRes()禁用。
26.2  抗锯齿API函数实例演示
    STemWin支持的抗锯齿函数主要如下:
26.4.png

26.2.1      函数GUI_AA_DrawArc
模拟器上运行代码如下:
  1. #include "GUI.h"

  2. void MainTask(void)
  3. {
  4.      GUI_Init();

  5.      /* 设置画笔粗细 */
  6.      GUI_SetPenSize(4);
  7.      GUI_SetColor(GUI_RED);
  8.    
  9.      /* 使能高分辨率 */
  10.      GUI_AA_EnableHiRes();

  11.      /* 抗锯齿因数选择1 */
  12.      GUI_AA_SetFactor(1);
  13.      GUI_AA_DrawArc(50,120,50,50,0,180);

  14.      /* 抗锯齿因数选择3 */
  15.      GUI_AA_SetFactor(3);
  16.      GUI_AA_DrawArc(160*3,120*3,50*3,50*3,0,180);

  17.      /* 抗锯齿因数选择3 */
  18.      GUI_AA_SetFactor(6);
  19.      GUI_AA_DrawArc(270*6,120*6,50*6,50*6,0,180);
  20.    
  21.      while(1)
  22.      {
  23.          GUI_Delay(100);
  24.      }
  25. }
复制代码
     要注意选择了抗锯齿因数后,绘制是得乘以相应的因数。
显示效果如下:
26.5.png

26.2.2      函数GUI_AA_DrawLine
    模拟器上运行程序如下:
  1. #include "GUI.h"

  2. void MainTask(void)
  3. {
  4.      GUI_Init();

  5.      /* 设置画笔粗细 */
  6.      GUI_SetPenSize(40);
  7.      GUI_SetColor(GUI_RED);
  8.    
  9.      /* 使能高分辨率 */
  10.      GUI_AA_EnableHiRes();

  11.      /* 抗锯齿因数选择1 */
  12.      GUI_AA_SetFactor(1);
  13.      GUI_AA_DrawLine(50,40,50,120);

  14.      /* 抗锯齿因数选择3 */
  15.      GUI_AA_SetFactor(3);
  16.      GUI_AA_DrawLine(150*3,40*3,150*3,120*3);

  17.      /* 抗锯齿因数选择3 */
  18.      GUI_AA_SetFactor(6);
  19.      GUI_AA_DrawLine(250*6,40*6,250*6,120*6);
  20.    
  21.      while(1)
  22.      {
  23.          GUI_Delay(100);
  24.      }
  25. }
复制代码
实际效果如下:
26.6.png

26.2.3      函数GUI_AA_DrawPolyOutline
    模拟器上运行代码如下:
  1. #define countof(Array) (sizeof(Array) / sizeof(Array[0]))

  2. static GUI_POINT aPoints[] = {
  3.      { 0, 0 },
  4.      { 15, 30 },
  5.      { 0, 20 },
  6.      {-15, 30 }
  7. };

  8. void MainTask(void)
  9. {
  10.      GUI_Init();

  11.      GUI_SetPenSize(10);
  12.      GUI_SetColor(GUI_RED);

  13.      GUI_AA_DrawPolyOutline(aPoints, countof(aPoints), 3, 150, 40);
  14.    
  15.      while(1)
  16.      {
  17.          GUI_Delay(100);
  18.      }
  19. }
复制代码
    使用这个函数要注意:通过连接终点和起点,可使绘制的多线条自动闭合。起点不得再次指定为终点。
    如果采用高分辨率模式,则必须使用高分辨率坐标。否则,必须指定为像素值。默认情况下,该函数处理的定义点不超过10个。如果多边形由10个以的点构成,则必须使用GUI_AA_DrawPolyOutlineEx()函数。
实际效果如下:
26.7.png

26.2.4      函数GUI_AA_DrawRoundedRect
    模拟器上运行的代码如下:
  1. #include "GUI.h"

  2. void MainTask(void)
  3. {
  4.      GUI_Init();
  5.      GUI_SetBkColor(GUI_WHITE);
  6.      GUI_Clear();
  7.      GUI_SetColor(GUI_DARKBLUE);
  8.      GUI_SetPenSize(5);
  9.      GUI_AA_DrawRoundedRect(10, 10, 50, 50, 5);
  10.    
  11.      while(1)
  12.      {
  13.          GUI_Delay(100);
  14.      }
  15. }
复制代码
实际显示效果如下:
26.8.png
26.2.5      函数GUI_AA_FillCircle
    模拟器上运行的代码如下:
  1. #include "GUI.h"

  2. void MainTask(void)
  3. {
  4.      GUI_Init();
  5.      GUI_AA_EnableHiRes();
  6.      GUI_SetBkColor(GUI_WHITE);
  7.      GUI_Clear();
  8.      GUI_SetColor(GUI_DARKBLUE);
  9.      GUI_SetPenSize(5);
  10.      GUI_AA_SetFactor(3);
  11.      GUI_AA_FillCircle(160*3, 120*3, 80*3);
  12.    
  13.      while(1)
  14.      {
  15.          GUI_Delay(100);
  16.      }
  17. }
复制代码
实际显示效果如下:
26.9.png
26.2.6      函数GUI_AA_FillPolygon
    模拟器上运行的代码如下:
  1. #include "GUI.h"

  2. #define countof(Array) (sizeof(Array) / sizeof(Array[0]))

  3. static GUI_POINT aPoints[] = {   (1)
  4.      { 0, 0 },
  5.      { 70, -30 },
  6.      { 0, 50 },
  7.      {-70, -30 }
  8. };

  9. void MainTask(void)
  10. {
  11.      GUI_Init();

  12.      GUI_SetPenSize(10);
  13.      GUI_SetColor(GUI_RED);

  14.      GUI_AA_FillPolygon(aPoints, countof(aPoints), 150, 40);
  15.    
  16.      while(1)
  17.      {
  18.          GUI_Delay(100);
  19.      }
  20. }
复制代码
1.    这些坐标点是相对于函数GUI_AA_FillPolygon中的X,Y坐标而言的。
实际运行效果如下:
26.10.png

26.2.7      函数GUI_AA_FillRoundedRect
    模拟器上运行的代码如下:
  1. #include "GUI.h"

  2. void MainTask(void) {
  3.      GUI_Init();
  4.      GUI_SetBkColor(GUI_WHITE);
  5.      GUI_Clear();
  6.      GUI_SetColor(GUI_DARKBLUE);
  7.      GUI_AA_FillRoundedRect(10, 10, 54, 54, 5);
  8.      while (1);
  9.      {
  10.      }
  11. }
复制代码
实际显示效果如下:
26.11.png

26.3  总结
    本期教程就跟大家讲这么多,下期教程再跟大家详细的讲解两个抗锯齿相关的应用例子。

收藏 评论3 发布时间:2015-2-6 16:54

举报

3个回答
feel-376797 回答时间:2015-2-8 18:56:31
谢谢分享
abb200628 回答时间:2015-2-11 18:39:34
很好的资料,谢谢分享
MouseCat 回答时间:2015-2-11 21:05:10
好东西,收藏了哈

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版