在上次字体篇提到要追加GB2312的全部汉字到点阵字库中。但由于GF的字库不是标准点阵字库,它用FF表示一个点,所以字库无法在现有的点阵字库中得到,而只能通过写程序生成GF格式的点阵字库。引出另一个问题,这么多汉字的点阵应该怎么生成。比较好的解决方法是把的矢量字库中的字转换成我们需要的点阵格式。
矢量字体转换成点阵字体需要以下几步,(以转换为16*16点阵的字体为例):
1. 准备一个背景是白色的16*16点阵的位图。
2. 读位图到内存,在图片上居中写入你要转换的字。
3. 循环读位图每一位的颜色信息,如果此点颜色是黑色,证明是一个点,写入FF,其它位置写入0,得到点阵。
以下是生成单个字的转换函数(c#实现):
/// <summary>
/// 生成单个16*16点阵的字库
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private byte[,] DrawChar(string str)
{
byte[,] result = new byte[16,16];
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Near;
Bitmap bmp = new Bitmap(Application.StartupPath +"\\blank.bmp",true);
Graphics g = Graphics.FromImage(bmp);
//参数大小只适用于16*16点阵
g.DrawString(str,new Font("宋体",12),Brushes.Black,new Rectangle(0,0,16,16),sf);
//结果写入16*16 字节数组
for(int i=0; i<bmp.Height; i++)
for(int j=0; j<bmp.Width;j++)
{
if(bmp.GetPixel(j,i) == Color.FromArgb(255,255,255))//白色
result[i,j] = 0;
else
result[i,j] = 0xff;
}
return result;
}
/// 生成单个16*16点阵的字库
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private byte[,] DrawChar(string str)
{
byte[,] result = new byte[16,16];
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Near;
Bitmap bmp = new Bitmap(Application.StartupPath +"\\blank.bmp",true);
Graphics g = Graphics.FromImage(bmp);
//参数大小只适用于16*16点阵
g.DrawString(str,new Font("宋体",12),Brushes.Black,new Rectangle(0,0,16,16),sf);
//结果写入16*16 字节数组
for(int i=0; i<bmp.Height; i++)
for(int j=0; j<bmp.Width;j++)
{
if(bmp.GetPixel(j,i) == Color.FromArgb(255,255,255))//白色
result[i,j] = 0;
else
result[i,j] = 0xff;
}
return result;
}