搜索
bottom↓
回复: 8

分享_ZLGGUI字体放大_函数

[复制链接]

出0入0汤圆

发表于 2015-9-7 14:15:49 | 显示全部楼层 |阅读模式
本帖最后由 zyqcome 于 2015-9-7 14:17 编辑

这个的效果是字体放大。ZLGGUI里,如果要多做几种字体显示的话,就会有好几个字体库,程序代码会越来越大。又不想做外部存储,这样要单独的写专门烧写flash的代码。

我想把点阵数据当图片处理。然后用图片处理的办法来放大它。

先试了一下在函数上改。没有研究算法,直接改出来的。
出来的效果还可以用,虽然很粗糙,但实现简单。分享上来接受大家批评

原来显示方式://        GUI_PutString72_72(20, 100,"ABCD");//需要一个72×72的库
修改后显示:        GUI_PutString24_24_AMP(10, 80,3,"ABCD");//一个24×24的就够了

原来的调用函数:
  1. /**
  2. * @brief  显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及':'(若为其它值,则显示' ')。
  3. * @param  x 指定显示位置,x坐标
  4. * @param  y 指定显示位置,y坐标
  5. * @param  ch 要显示的ASCII码值。
  6. * @retval None
  7. */
  8. unsigned char GUI_PutChar24_24( int x, int y, unsigned char ch )
  9. {
  10.         unsigned char        font_dat;
  11.         unsigned char        i, j;
  12.         unsigned char        get_color_back[2], get_color_disp[2];
  13.         bit                color_back_disp = 0;
  14.         get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
  15.         get_color_2( disp_color[0], disp_color[1], disp_color[2], get_color_disp );
  16. /* 参数过滤 */
  17.         if ( x > (GUI_LCM_XMAX - 24) )
  18.                 return(0);
  19.         if ( y > (GUI_LCM_YMAX - 24) )
  20.                 return(0);
  21.         for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
  22.         {
  23.                 if ( FONT24x24_TAB[i] == ch )
  24.                         break;
  25.         }
  26.         ch = i;
  27.         Set_xywh( x, y, 24, 24 );                                       /* 画图区域 */
  28.         for ( i = 0; i < 24; i++ )                                      /* 显示共32行 */
  29.         {
  30.                 for ( j = 0; j < 24; j++ )                              /* 每行共24点 */
  31.                 {                                                       /* 若当前点为0、8、16点,读取点阵数据 */
  32.                         /*
  33.                          * font_dat =  0xff;
  34.                          *        if( (j&0x07)==0 ) font_dat = FONT24x32[ch][i*3+j>>3];//+j>>3
  35.                          */
  36.                         if ( j == 0 )
  37.                                 font_dat = FONT24x24[ch][i * 3];        /* +j>>3 */
  38.                         if ( j == 8 )
  39.                                 font_dat = FONT24x24[ch][i * 3 + 1];    /* +j>>3 */
  40.                         if ( j == 16 )
  41.                                 font_dat = FONT24x24[ch][i * 3 + 2];    /* +j>>3 */
  42.                         /* 设置相应的点为color或为back_color */
  43.                         if ( (font_dat & DCB2HEX_TAB[j % 8]) == 0 )
  44.                                 color_back_disp = 0;
  45.                         else color_back_disp = 1;
  46.                         if ( color_back_disp == 1 )
  47.                         {
  48.                                 write_DISPdata_16( get_color_disp[0], get_color_disp[1] );
  49.                         }else{
  50.                                 write_DISPdata_16( get_color_back[0], get_color_back[1] );
  51.                         }
  52.                 }
  53.                 y++; /* 指向下一行 */
  54.         }
  55.         return(1);
  56. }


  57. /**
  58. * @brief  输出显示字符串(没有自动换行功能)。
  59. * @param  x 指定显示位置,x坐标
  60. * @param  y 指定显示位置,y坐标
  61. * @param  str 要显示的ASCII码串。
  62. * @retval None
  63. */
  64. void GUI_PutString24_24( int x, int y, char *str )
  65. {
  66.         while ( 1 )
  67.         {
  68.                 if ( (*str) == '\0' )
  69.                         break;
  70.                 if ( GUI_PutChar24_24( x, y, *str++ ) == 0 )
  71.                         break;
  72.                 x += 25; /* 下一个字符显示位置,y不变(即不换行) */
  73.         }
  74. }
复制代码


修改后的函数:就是在原函数上增加了一个amp做乘数
  1. /**
  2. * @brief  显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及':'(若为其它值,则显示' ')。
  3. * @param  x 指定显示位置,x坐标
  4. * @param  y 指定显示位置,y坐标
  5. * @param  amp 放大倍数
  6. * @param  ch 要显示的ASCII码值。
  7. * @retval None
  8. */
  9. unsigned char GUI_PutChar24_24_AMP( int x, int y, int amp, unsigned char ch )
  10. {
  11.         unsigned char        font_dat;
  12.         unsigned char        i, j;
  13.         unsigned char        get_color_back[2], get_color_disp[2];
  14.         bit                color_back_disp = 0;
  15.         get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
  16.         get_color_2( disp_color[0], disp_color[1], disp_color[2], get_color_disp );
  17.         /* 参数过滤 */
  18.         if ( x > (GUI_LCM_XMAX - 24) )
  19.                 return(0);
  20.         if ( y > (GUI_LCM_YMAX - 24) )
  21.                 return(0);
  22.         for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
  23.         {
  24.                 if ( FONT24x24_TAB[i] == ch )
  25.                         break;
  26.         }
  27.         ch = i;
  28.         Set_xywh( x, y, 24 * amp, 24 * amp );                           /* 画图区域 */
  29.         for ( i = 0; i < (24 * amp); i++ )                              /* 显示共32行*/
  30.         {
  31.                 for(j=0; j<(24*amp); j++) /* 每行共24点 */
  32.         {                                                               /* 若当前点为0、8、16点,读取点阵数据 */
  33.                 /*
  34.                  * font_dat =  0xff;
  35.                  *        if( (j&0x07)==0 ) font_dat = FONT24x32[ch][i*3+j>>3];//+j>>3
  36.                  */
  37.                 if ( j / amp == 0 )
  38.                         font_dat = FONT24x24[ch][i / amp * 3];          /* +j>>3 */
  39.                 if ( j / amp == 8 )
  40.                         font_dat = FONT24x24[ch][i / amp * 3 + 1];      /* +j>>3 */
  41.                 if ( j / amp == 16 )
  42.                         font_dat = FONT24x24[ch][i / amp * 3 + 2];      /* +j>>3 */
  43.                 /* 设置相应的点为color或为back_color */
  44.                 if ( (font_dat & DCB2HEX_TAB[(j / amp) % 8]) == 0 )
  45.                         color_back_disp = 0;
  46.                 else color_back_disp = 1;
  47.                 if ( color_back_disp == 1 )
  48.                 {
  49.                         write_DISPdata_16( get_color_disp[0], get_color_disp[1] );
  50.                 }else{
  51.                         write_DISPdata_16( get_color_back[0], get_color_back[1] );
  52.                 }
  53.         }
  54.         y++; /* 指向下一行 */
  55. }


  56. return(1);
  57. }


  58. /**
  59. * @brief  输出显示字符串(没有自动换行功能)。自动放大
  60. * @param  x 指定显示位置,x坐标
  61. * @param  y 指定显示位置,y坐标
  62. * @param  amp 放大倍数
  63. * @param  str 要显示的ASCII码串。
  64. * @retval None
  65. */
  66. void GUI_PutString24_24_AMP( int x, int y, int amp, char *str )
  67. {
  68.         while ( 1 )
  69.         {
  70.                 if ( (*str) == '\0' )
  71.                         break;
  72.                 if ( GUI_PutChar24_24_AMP( x, y, amp, *str++ ) == 0 )
  73.                         break;
  74.                 x += 25 * amp; /* 下一个字符显示位置,y不变(即不换行) */
  75.         }
  76. }
复制代码


显示效果:3倍放大


2015-09-07 14:16 修改错字

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入93汤圆

发表于 2015-9-7 14:22:13 | 显示全部楼层
字体缩放,没有插值吧锯齿严重,有插值吧边缘发虚,很难取舍的。
你这个没有插值,锯齿已经惨不忍睹了

出75入0汤圆

发表于 2015-9-7 17:17:39 | 显示全部楼层
还是有用的,谢谢楼主思路。

出0入0汤圆

发表于 2015-9-7 17:22:01 | 显示全部楼层
点阵字体放大2倍还能凑合着看,3倍以上就没法看了

出0入0汤圆

发表于 2015-9-7 19:34:00 | 显示全部楼层
思路不错啊。谢谢

出0入0汤圆

发表于 2015-9-8 13:50:46 | 显示全部楼层
还可以这么搞,厉害!

出0入0汤圆

发表于 2015-9-8 22:26:57 来自手机 | 显示全部楼层
挺厉害,赞!

出0入0汤圆

发表于 2015-9-8 23:21:04 来自手机 | 显示全部楼层
厉害

出10入0汤圆

发表于 2015-9-9 00:24:08 来自手机 | 显示全部楼层
不错,关注!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-6 12:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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