转-一种做界面的去锯齿方法

admin 2017-6-7 3941


我们在做嵌入式界面时,有两种方案可供选择 :1是用商业化的gui,比如emwin。2是自己做界面。

下面主要介绍方法2。

先贴张图,对比下锯齿的效果

  

我找过很多软件,想能否生成抗锯齿的字体,都没找到。想着以后自己用QT写一个抗锯齿字体的提取软件,这是后话。

在photoshop中,我们输入的文字默认都是抗锯齿的,我想很多人都想过用图片的方式将每个字母的抗锯齿图片保存下来,然后放入flash或内存中,调用显示。

这样最是简单,但是也很暴力,因为工作量太大,为了适应不同的背景,工作量也是倍数增加,后期的维护也是很悲催的。

我介绍的方法是将所有的字母写在一个背景图片中,然后程序上调用显示。具体做法如下:

1, photoshop中,先将背景颜色设置好 

2, 键入需要的ascii字符(我这里用了标准ascii和欧文集iso88591)

  

3, 保存为 .bmp格式,然后打开彩色取模(我用的是Img2Lcd)软件,生成.h 数据,保存在内存中。或者生成.bin文件,保存在外部存储器中。

  

4, 调用字库显示一个字符函数如下:

void Char_UbuntuMono_FrontGround_8_17(int x, int y, unsigned char c)
{//8*32 = 256 wide
  //17*5 = 85  high  
    unsigned int i, j, factor;
    
    if(c < 128)    c = c - ' ';
    else           c = c - 96;
    
    factor = c/32;
    
    for(i = 0;i < 17; i++){
        for(j = 0; j < 8; j++){
           frambuf[800*(i + x) + j + y] = UbuntuMono_FrontGround_8_17[256*2*(factor*17 + i) + (c - factor*32)*8*2 + j*2]<<8|
                                          UbuntuMono_FrontGround_8_17[256*2*(factor*17 + i) + (c - factor*32)*8*2 + j*2 + 1];
        }
    }
}


显示字符串函数如下:

void String_UbuntuMono_FrontGround_8_17(int x,int y, unsigned char *str)
{
    unsigned char *p = str;
    while (*p != 0){
        Char_UbuntuMono_FrontGround_8_17(x, y, *p);
        y = y + 8;
        p++; 
    }
}


最后贴张抗锯齿界面图

  



追加:

更节约的方法是图片资源只使用黑底白字,带上抗锯齿之后保存BMP,这样你得到的实际上是带alpha通道的位图。在输出的时候不管背景上是什么,你对每个点做动态叠加就行了,总是可以在底图上生成正确的抗锯齿的文字。

对每个点,输出值=alpha*文本色+(255-alpha)*原来背景色

为了减少乘法,alpha=0的时候不写输出即可(输出就是原来的背景色)

只要你能读背景图,不管背景图是什么样,都可以用这个算法来叠加任意前景色的带半透明通道的字体。

而且只要预先做好一个黑底白字的带抗锯齿的文字图当作半透明通道就行了。

正常是24位bmp,每个点随便取rgb哪个分量都行。三个分量是一样的。

如果你可以存8位灰度的bmp,就省了2/3的大小

最新回复 [0]
返回