分享_ZLGGUI字体放大_函数

2020-01-19 19:40发布

本帖最后由 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) == '' )
  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) == '' )
  71.                         break;
  72.                 if ( GUI_PutChar24_24_AMP( x, y, amp, *str++ ) == 0 )
  73.                         break;
  74.                 x += 25 * amp; /* 下一个字符显示位置,y不变(即不换行) */
  75.         }
  76. }
复制代码

显示效果:3倍放大
无标题.png (376.23 KB, 下载次数: 0) 下载附件 2015-9-7 14:15 上传

2015-09-07 14:16 修改错字
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
takashiki
1楼-- · 2020-01-19 21:32
字体缩放,没有插值吧锯齿严重,有插值吧边缘发虚,很难取舍的。
你这个没有插值,锯齿已经惨不忍睹了
minzhuzhongguo
2楼-- · 2020-01-20 00:12
 精彩回答 2  元偷偷看……
modbus
3楼-- · 2020-01-20 01:09
点阵字体放大2倍还能凑合着看,3倍以上就没法看了
hxhz123456
4楼-- · 2020-01-20 05:26
思路不错啊。谢谢
374184600
5楼-- · 2020-01-20 06:18
还可以这么搞,厉害!
ljt80158015
6楼-- · 2020-01-20 06:35
挺厉害,赞!

一周热门 更多>