zyqcome 发表于 2015-9-7 14:15:49

分享_ZLGGUI字体放大_函数

本帖最后由 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的就够了

原来的调用函数:
/**
* @brief显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及':'(若为其它值,则显示' ')。
* @paramx 指定显示位置,x坐标
* @paramy 指定显示位置,y坐标
* @paramch 要显示的ASCII码值。
* @retval None
*/
unsigned char GUI_PutChar24_24( int x, int y, unsigned char ch )
{
        unsigned char        font_dat;
        unsigned char        i, j;
        unsigned char        get_color_back, get_color_disp;
        bit                color_back_disp = 0;
        get_color_2( back_color, back_color, back_color, get_color_back );
        get_color_2( disp_color, disp_color, disp_color, get_color_disp );
/* 参数过滤 */
        if ( x > (GUI_LCM_XMAX - 24) )
                return(0);
        if ( y > (GUI_LCM_YMAX - 24) )
                return(0);
        for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
        {
                if ( FONT24x24_TAB == ch )
                        break;
        }
        ch = i;
        Set_xywh( x, y, 24, 24 );                                       /* 画图区域 */
        for ( i = 0; i < 24; i++ )                                    /* 显示共32行 */
        {
                for ( j = 0; j < 24; j++ )                              /* 每行共24点 */
                {                                                       /* 若当前点为0、8、16点,读取点阵数据 */
                        /*
                       * font_dat =0xff;
                       *      if( (j&0x07)==0 ) font_dat = FONT24x32;//+j>>3
                       */
                        if ( j == 0 )
                                font_dat = FONT24x24;      /* +j>>3 */
                        if ( j == 8 )
                                font_dat = FONT24x24;    /* +j>>3 */
                        if ( j == 16 )
                                font_dat = FONT24x24;    /* +j>>3 */
                        /* 设置相应的点为color或为back_color */
                        if ( (font_dat & DCB2HEX_TAB) == 0 )
                                color_back_disp = 0;
                        else color_back_disp = 1;
                        if ( color_back_disp == 1 )
                        {
                                write_DISPdata_16( get_color_disp, get_color_disp );
                        }else{
                                write_DISPdata_16( get_color_back, get_color_back );
                        }
                }
                y++; /* 指向下一行 */
        }
        return(1);
}


/**
* @brief输出显示字符串(没有自动换行功能)。
* @paramx 指定显示位置,x坐标
* @paramy 指定显示位置,y坐标
* @paramstr 要显示的ASCII码串。
* @retval None
*/
void GUI_PutString24_24( int x, int y, char *str )
{
        while ( 1 )
        {
                if ( (*str) == '\0' )
                        break;
                if ( GUI_PutChar24_24( x, y, *str++ ) == 0 )
                        break;
                x += 25; /* 下一个字符显示位置,y不变(即不换行) */
        }
}

修改后的函数:就是在原函数上增加了一个amp做乘数
/**
* @brief显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及':'(若为其它值,则显示' ')。
* @paramx 指定显示位置,x坐标
* @paramy 指定显示位置,y坐标
* @paramamp 放大倍数
* @paramch 要显示的ASCII码值。
* @retval None
*/
unsigned char GUI_PutChar24_24_AMP( int x, int y, int amp, unsigned char ch )
{
        unsigned char        font_dat;
        unsigned char        i, j;
        unsigned char        get_color_back, get_color_disp;
        bit                color_back_disp = 0;
        get_color_2( back_color, back_color, back_color, get_color_back );
        get_color_2( disp_color, disp_color, disp_color, get_color_disp );
        /* 参数过滤 */
        if ( x > (GUI_LCM_XMAX - 24) )
                return(0);
        if ( y > (GUI_LCM_YMAX - 24) )
                return(0);
        for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
        {
                if ( FONT24x24_TAB == ch )
                        break;
        }
        ch = i;
        Set_xywh( x, y, 24 * amp, 24 * amp );                           /* 画图区域 */
        for ( i = 0; i < (24 * amp); i++ )                              /* 显示共32行*/
        {
                for(j=0; j<(24*amp); j++) /* 每行共24点 */
        {                                                               /* 若当前点为0、8、16点,读取点阵数据 */
                /*
               * font_dat =0xff;
               *      if( (j&0x07)==0 ) font_dat = FONT24x32;//+j>>3
               */
                if ( j / amp == 0 )
                        font_dat = FONT24x24;          /* +j>>3 */
                if ( j / amp == 8 )
                        font_dat = FONT24x24;      /* +j>>3 */
                if ( j / amp == 16 )
                        font_dat = FONT24x24;      /* +j>>3 */
                /* 设置相应的点为color或为back_color */
                if ( (font_dat & DCB2HEX_TAB[(j / amp) % 8]) == 0 )
                        color_back_disp = 0;
                else color_back_disp = 1;
                if ( color_back_disp == 1 )
                {
                        write_DISPdata_16( get_color_disp, get_color_disp );
                }else{
                        write_DISPdata_16( get_color_back, get_color_back );
                }
        }
        y++; /* 指向下一行 */
}


return(1);
}


/**
* @brief输出显示字符串(没有自动换行功能)。自动放大
* @paramx 指定显示位置,x坐标
* @paramy 指定显示位置,y坐标
* @paramamp 放大倍数
* @paramstr 要显示的ASCII码串。
* @retval None
*/
void GUI_PutString24_24_AMP( int x, int y, int amp, char *str )
{
        while ( 1 )
        {
                if ( (*str) == '\0' )
                        break;
                if ( GUI_PutChar24_24_AMP( x, y, amp, *str++ ) == 0 )
                        break;
                x += 25 * amp; /* 下一个字符显示位置,y不变(即不换行) */
        }
}

显示效果:3倍放大


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

takashiki 发表于 2015-9-7 14:22:13

字体缩放,没有插值吧锯齿严重,有插值吧边缘发虚,很难取舍的。
你这个没有插值,锯齿已经惨不忍睹了

minzhuzhongguo 发表于 2015-9-7 17:17:39

还是有用的,谢谢楼主思路。

modbus 发表于 2015-9-7 17:22:01

点阵字体放大2倍还能凑合着看,3倍以上就没法看了

hxhz123456 发表于 2015-9-7 19:34:00

思路不错啊。谢谢

374184600 发表于 2015-9-8 13:50:46

还可以这么搞,厉害!

ljt80158015 发表于 2015-9-8 22:26:57

挺厉害,赞!

机器人天空 发表于 2015-9-8 23:21:04

厉害

dgtg 发表于 2015-9-9 00:24:08

不错,关注!!
页: [1]
查看完整版本: 分享_ZLGGUI字体放大_函数