分享_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 修改错字
字体缩放,没有插值吧锯齿严重,有插值吧边缘发虚,很难取舍的。
你这个没有插值,锯齿已经惨不忍睹了 还是有用的,谢谢楼主思路。 点阵字体放大2倍还能凑合着看,3倍以上就没法看了 思路不错啊。谢谢 还可以这么搞,厉害! 挺厉害,赞! 厉害 不错,关注!!
页:
[1]