|
本帖最后由 chun2495 于 2017-6-23 17:58 编辑
上一贴中(给大家介绍一种做界面的去锯齿方法 ),介绍了一种不采用gui的抗锯齿方法,后来经15楼大神redroof点拨,终于参透了gui中的抗锯齿算法思路。
下来,给大家分享一下该方法和程序。
首先,在上贴中提到需要准备一副含有黑纸白字的图片,如下
然后用彩色字模读取数据
注意这里选择256灰阶,如果内存小的话,也可以取16灰阶,不过最大的抗锯齿就只能到16,如果是256阶的话,抗锯齿级别可以是256,128,64,62,16,4,2,这在后面的程序中会介绍。这也是gui的抗锯齿级别。
建议最好别小于16。16比256的数据量小一倍,相当于一个字节保存两个数据点。
然后开始写程序,我这边没有用画点函数drawpoint,而是直接用显示器的buffer。
- void Char_UbuntuMono_16(int x, int y, unsigned char c, unsigned short color, unsigned short back_color)
- {//12*32 = 384 wide
- //26*5 = 130 high
- unsigned int i, j, factor;
- unsigned char alpha;
- float alpha_factor;
- unsigned char color_R,color_G,color_B;
- unsigned char back_color_R,back_color_G,back_color_B;
-
- color_R = color >> 11 << 3;
- color_G = color << 5 >> 10 << 2;
- color_B = color << 3;
-
- back_color_R = back_color >> 11 << 3;
- back_color_G = back_color << 5 >> 10 << 2;
- back_color_B = back_color << 3;
-
- if(c < 128) c = c - ' ';
- else c = c - 96;
-
- factor = c/32;
-
- for(i = 0;i < 26; i++){
- for(j = 0; j < 12; j++){
- alpha = font_16[384*(factor*26 + i) + (c - factor*32)*12 + j];//>>4
- if(alpha == 255/*15*/) frambuf[800*(i + x) + j + y] = color;
- else if(alpha == 0) frambuf[800*(i + x) + j + y] = back_color;
- else{
- alpha_factor = 1.0*alpha/255/*15*/;
- frambuf[800*(i + x) + j + y] = (((char)(alpha_factor*(color_R - back_color_R)) + back_color_R) >> 3) << 11 |
- (((char)(alpha_factor*(color_G - back_color_G)) + back_color_G) >> 2) << 5 |
- (((char)(alpha_factor*(color_B - back_color_B)) + back_color_B) >> 3) ;
- }
- }
- }
- }
复制代码
这是显示一个字符的函数,color_R,color_G,color_B是先将RGB565的数据拆分为R、G、B,背景色同理。
alpha 就是我们刚才存储的数据像素点的值。
alpha_factor*(color_R - back_color_R)) + back_color_R这个公式我解释一下,像素点的颜色=(alpha/255)*color + (255 - alpha)*back_color,转换下就是(alpha/255)*(color - back_color) + back_color;
然后将R/G/B分量各自计算出来,最后按位或成565数据。
因为数据中其实大部分都是255和0,为了显示提高显示速度和节省CPU资源,就将他们分别列出来
- if(alpha == 255/*15*/) frambuf[800*(i + x) + j + y] = color;
- else if(alpha == 0) frambuf[800*(i + x) + j + y] = back_color;
复制代码
前面提到过抗锯齿级别,我这里直接用的是255级别,直接写死了,如果需要调节锯齿级别,需要自己定义一个级别数,修改三个地方即可(我已经在注释/* */里把16级别的写出来了)。
字符串函数还是那样写
- void String_UbuntuMono_16(int x,int y, unsigned char *str, unsigned short color, unsigned short back_color)
- {
- unsigned char *p = str;
- while (*p != 0){
- Char_UbuntuMono_16(x, y, *p, color, back_color);
- y = y + 12;
- p++;
- }
- }
复制代码
最后显示一下带有抗锯齿功能的字体
- String_UbuntuMono_16(200, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", COLOR_WHITE, COLOR_BACK_GROUND);
- String_UbuntuMono_16(230, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", COLOR_GREEN, COLOR_WHITE);
- String_UbuntuMono_16(260, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", COLOR_RED, COLOR_BLUE);
- String_UbuntuMono_16(290, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", COLOR_YELLOW, COLOR_BLACK);
复制代码
显示如下
再次感谢大神redroof!
往期帖子 :
给大家介绍一种做界面的去锯齿方法 https://www.amobbs.com/thread-5675562-1-1.html
液晶多级菜单实现加强版 https://www.amobbs.com/thread-5599589-1-1.html
嵌入式全键盘拼音输入法分享 https://www.amobbs.com/thread-5668320-1-1.html
ucgui下制作漂亮按键 https://www.amobbs.com/thread-5551143-1-1.html |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|