硬汉嵌入式论坛

 找回密码
 立即注册
查看: 28|回复: 2
收起左侧

[emWin] 关于抗锯齿在浅背景色,深前景色时的毛刺问题请教。

[复制链接]

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 3 小时前 | 显示全部楼层 |阅读模式
我使用的是GD32F470,通过16bit的8080并口驱动LCD,LCD是320*480的分辨率,emwin的颜色深度配置成RGB565,开启了窗口的内存设备标志(WM_SetCreateFlags(WM_CF_MEMDEV);),在使用发现如下现象,在圆角矩形的绘制时,使用0x00F7F0FA的背景色,使用0x009B42DF的前景色,绘制出来圆角矩形会有毛刺现象,下面是效果图:,绘制的代码如下:        
        case WM_PAINT:
        {
            GUI_RECT rt = {0};
            WM_GetClientRectEx(pMsg->hWin, &rt);
            GUI_AA_SetFactor(get_AA_factor());
            /* 绘制背景:主界面背景色 */
            GUI_SetBkColor(get_primary_bk_color());
            GUI_Clear();
            /* 圆角矩形,居中 */
            GUI_RECT boxRt;
            boxRt.x0 = LOCK_RECT_X;
            boxRt.y0 = LOCK_RECT_Y;
            boxRt.x1 = LOCK_RECT_X + LOCK_RECT_W - 1;
            boxRt.y1 = LOCK_RECT_Y + LOCK_RECT_H - 1;
            /* 圆角矩形外框:master色 */
            GUI_SetColor(get_master_color());
            GUI_AA_FillRoundedRectEx(&boxRt, LOCK_RECT_RAD);
            /* 圆角矩形内部:白色(内缩2px) */
            GUI_RECT innerRt = boxRt;
            innerRt.x0 += 2;
            innerRt.y0 += 2;
            innerRt.x1 -= 2;
            innerRt.y1 -= 2;
            GUI_SetColor(GUI_WHITE);
            GUI_AA_FillRoundedRectEx(&innerRt, LOCK_RECT_RAD - 2);
            /* 计算当前圆形中心X (基于滑动偏移) */
            int circleCX = LOCK_CIRCLE_HOME_X + s_lockDrag.offsetX;
            int circleCY = (boxRt.y0 + boxRt.y1) / 2;
            /* 解锁图标:紫色圆角矩形轨道 + 圆形图标(在轨道内部移动) */
            {
                /* 绘制紫色圆角矩形轨道:从右侧HOME位置延伸到当前圆形中心位置 */
                /* 圆形在轨道左端,轨道包裹圆形 */
                GUI_RECT trackRt;
                trackRt.x0 = circleCX - LOCK_ICON_CIRCLE_R;
                trackRt.y0 = circleCY - LOCK_ICON_CIRCLE_R;
                trackRt.x1 = LOCK_CIRCLE_HOME_X + LOCK_ICON_CIRCLE_R;
                trackRt.y1 = circleCY + LOCK_ICON_CIRCLE_R;
                GUI_SetColor(get_master_color());
                GUI_AA_FillRoundedRectEx(&trackRt, LOCK_ICON_CIRCLE_R);
                /* 在圆形位置绘制白色填充圆(覆盖紫色,形成图标背景) */
                GUI_AA_FillCircle(circleCX, circleCY, LOCK_ICON_CIRCLE_R - 2);
                /* 白色圆内绘制锁图标 (ICO_LOCK_WHITE, 24x24) */
                int icoX = circleCX - 12;
                int icoY = circleCY - 12;
                USER_BMP_DrawEx(ICO_LOCK_WHITE, icoX, icoY);
                /* 长按进度弧(仅在长按计时时显示,绘于图标外圈) */
                if(s_lockLongPress.active && s_lockLongPress.ticks > 0U)
                {
                    int progress = (int)s_lockLongPress.ticks * 100
                                    / (int)LOCK_LONGPRESS_MAX_TICKS;
                    int arcR = LOCK_ICON_CIRCLE_R + 3;
                    GUI_SetPenSize(3);
                    /* 灰色底圆环 */
                    GUI_SetColor(0x00CCCCCC);
                    GUI_DrawCircle(circleCX, circleCY, arcR);
                    /* 主色进度弧(从12点钟顺时针) */
                    GUI_SetColor(get_master_color());
                    GUI_DrawArc(circleCX, circleCY, arcR, arcR,
                                    90 - progress * 360 / 100, 90);
                    GUI_SetPenSize(1);
                }
            }
            /* 绘制"滑动解锁"文字(始终居中显示,不随拖动移动) */
            {
                GUI_RECT textRt = innerRt;
                GUI_SetFont(FONT_20_BOLD);
                GUI_SetTextMode(GUI_TEXTMODE_TRANS);
                GUI_SetColor(get_font_secondary_color());
                GUI_DispStringInRect(trUtf8(STR_SLIDE_TO_UNLOCK),
                    &textRt, GUI_TA_HCENTER | GUI_TA_VCENTER);
            }
            break;
        }
想请教一下有什么办法可以优化这个显示效果吗?


回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 3 小时前 | 显示全部楼层
这是显示效果,emwin的版本是6.52.

12.png
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123004
QQ
发表于 3 小时前 | 显示全部楼层
在你的程序里面运行下这个,看看抗锯齿效果显示正常不,如果正常,没问题




[C] 纯文本查看 复制代码
/*********************************************************************
* SEGGER Microcontroller GmbH *
* Solutions for real time microcontroller applications *
* *
* emWin example code *
* *
**********************************************************************
----------------------------------------------------------------------
File : AA_Lines.c
Purpose : Shows lines with different antialiasing qualities
----------------------------------------------------------------------
*/
#include "GUI.h"
/*******************************************************************
*
* Show lines with different antialiasing qualities
*
********************************************************************
*/
static void DemoAntialiasing(void) {
int i, x1, x2, y;
y = 2;
//
// Set drawing attributes
//
GUI_SetColor(GUI_BLACK);
GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
x1 = 10;
x2 = 90;
//
// Draw lines without antialiasing
//
GUI_DispStringHCenterAt("\nNormal", (x1 + x2) / 2, 10);
for (i = 1; i < 12; i++) {
GUI_SetPenSize(i);
GUI_DrawLine(x1, 40 + i * 15, x2, 40 + i * 15 + y);
}
x1 = 110;
x2 = 190;
//
// Draw lines with antialiasing quality factor 2
//
GUI_AA_SetFactor(2);
GUI_DispStringHCenterAt("Antialiased\n\nusing factor 2", (x1 + x2) / 2, 10);
for (i = 1; i < 12; i++) {
GUI_SetPenSize(i);
GUI_AA_DrawLine(x1, 40 + i * 15, x2, 40 + i * 15 + y);
}
x1 = 210;
x2 = 290;
//
// Draw lines with antialiasing quality factor 6
//
GUI_AA_SetFactor(6);
GUI_DispStringHCenterAt("Antialiased\n\nusing factor 6", (x1 + x2) / 2, 10);
for (i = 1; i < 12; i++) {
GUI_SetPenSize(i);
GUI_AA_DrawLine(x1, 40 + i * 15, x2, 40 + i * 15 + y);
 
}
}
/*******************************************************************
*
* MainTask
*
********************************************************************
*/
void MainTask(void) {
GUI_Init();
DemoAntialiasing();
while(1)
GUI_Delay(100);
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-6-10 13:41 , Processed in 0.565690 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表