本帖最后由 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'、'.'、'+'、'-'及':'(若为其它值,则显示' ')。
- * @param x 指定显示位置,x坐标
- * @param y 指定显示位置,y坐标
- * @param ch 要显示的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[2], get_color_disp[2];
- bit color_back_disp = 0;
- get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
- get_color_2( disp_color[0], disp_color[1], disp_color[2], 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[i] == 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[ch][i*3+j>>3];//+j>>3
- */
- if ( j == 0 )
- font_dat = FONT24x24[ch][i * 3]; /* +j>>3 */
- if ( j == 8 )
- font_dat = FONT24x24[ch][i * 3 + 1]; /* +j>>3 */
- if ( j == 16 )
- font_dat = FONT24x24[ch][i * 3 + 2]; /* +j>>3 */
- /* 设置相应的点为color或为back_color */
- if ( (font_dat & DCB2HEX_TAB[j % 8]) == 0 )
- color_back_disp = 0;
- else color_back_disp = 1;
- if ( color_back_disp == 1 )
- {
- write_DISPdata_16( get_color_disp[0], get_color_disp[1] );
- }else{
- write_DISPdata_16( get_color_back[0], get_color_back[1] );
- }
- }
- y++; /* 指向下一行 */
- }
- return(1);
- }
- /**
- * @brief 输出显示字符串(没有自动换行功能)。
- * @param x 指定显示位置,x坐标
- * @param y 指定显示位置,y坐标
- * @param str 要显示的ASCII码串。
- * @retval None
- */
- void GUI_PutString24_24( int x, int y, char *str )
- {
- while ( 1 )
- {
- if ( (*str) == ' ' )
- break;
- if ( GUI_PutChar24_24( x, y, *str++ ) == 0 )
- break;
- x += 25; /* 下一个字符显示位置,y不变(即不换行) */
- }
- }
复制代码
修改后的函数:就是在原函数上增加了一个amp做乘数
- /**
- * @brief 显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及':'(若为其它值,则显示' ')。
- * @param x 指定显示位置,x坐标
- * @param y 指定显示位置,y坐标
- * @param amp 放大倍数
- * @param ch 要显示的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[2], get_color_disp[2];
- bit color_back_disp = 0;
- get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
- get_color_2( disp_color[0], disp_color[1], disp_color[2], 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[i] == 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[ch][i*3+j>>3];//+j>>3
- */
- if ( j / amp == 0 )
- font_dat = FONT24x24[ch][i / amp * 3]; /* +j>>3 */
- if ( j / amp == 8 )
- font_dat = FONT24x24[ch][i / amp * 3 + 1]; /* +j>>3 */
- if ( j / amp == 16 )
- font_dat = FONT24x24[ch][i / amp * 3 + 2]; /* +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[0], get_color_disp[1] );
- }else{
- write_DISPdata_16( get_color_back[0], get_color_back[1] );
- }
- }
- y++; /* 指向下一行 */
- }
- return(1);
- }
- /**
- * @brief 输出显示字符串(没有自动换行功能)。自动放大
- * @param x 指定显示位置,x坐标
- * @param y 指定显示位置,y坐标
- * @param amp 放大倍数
- * @param str 要显示的ASCII码串。
- * @retval None
- */
- void GUI_PutString24_24_AMP( int x, int y, int amp, char *str )
- {
- while ( 1 )
- {
- if ( (*str) == ' ' )
- break;
- if ( GUI_PutChar24_24_AMP( x, y, amp, *str++ ) == 0 )
- break;
- x += 25 * amp; /* 下一个字符显示位置,y不变(即不换行) */
- }
- }
复制代码
显示效果:3倍放大
无标题.png (376.23 KB, 下载次数: 0)
下载附件
2015-9-7 14:15 上传
2015-09-07 14:16 修改错字
你这个没有插值,锯齿已经惨不忍睹了
一周热门 更多>