在页面中使用点阵显示汉字

上篇文章提到用数字点阵显示奥运倒计时,这里扩展一下,不仅可以用点阵显示数字,还可以用点阵显示汉字。先看演示效果。Javascript脚本部分还是使用原来DigitDisplay对象,只是在bitArray新增了两个成员。

  1. var kaka = new DigitDisplay();
  2. kaka.bitArray.fa = '0000000100000...';
  3. kaka.bitArray.cai = '000001000001...';
  4. kaka.holder = $("hanzi").getElementsByTagName('TABLE')[0];
  5. kaka.init('fa');
  6. kaka.holder = $("hanzi").getElementsByTagName('TABLE')[1];
  7. kaka.init('cai');

那怎么动态获取汉字的点阵呢,这里提供一个例程,其实是《C#实现读取点阵汉字》这篇文章所附代码的短小精悍压缩版。代码如下,注释部分是我自己的理解,可能有错误,请自行甄别,也欢迎跟我探讨。完整代码下载(包含HZK16点阵字库文件):http://panweizeng.com/download/lattice_display.rar
另外,如果你使用的是php,可以看看这篇文章《读取汉字点阵数据》

  1. public static string CharacterToCoding(string character)
  2. {
  3.     try
  4.     {
  5.         string _string = "";
  6.         for (int i = 0; i < character.Length; i++)
  7.         {
  8.             //取出二进制编码内容
  9.             byte[] array = System.Text.Encoding.Default.GetBytes(character.Substring(i, 1));
  10.  
  11.             //16*16汉字字模:在HZK16中偏移地址的计算方法, 设其内码为ABCD(AB为区码,CD为位码)
  12.             //array[0]为内码高位=区码+A0H=区码+160
  13.             //array[1]为内码低位=位码+A0H=位码+160
  14.             //横向读取时,偏移地址=[(AB-0xa1)*94(十进制)+(CD-0xa1)]*32(十进制)
  15.             int offset = (94 * (array[0] - 161) + (array[1] - 161)) * 32;
  16.  
  17.             //载入字库文件
  18.             FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory+"HZK16",
  19.                 FileMode.Open,
  20.                 FileAccess.Read
  21.             );
  22.             byte[] libBytes = new byte[fs.Length];
  23.             fs.Read(libBytes, 0, libBytes.Length);
  24.             fs.Close();
  25.            
  26.             //读取字模信息,转化为二进制的字符串
  27.             //16*16=256个点,一个字节(char)为8bit,则需要256/8=32个字节
  28.             //一次位移为2,即一次读两个字节,共16个点
  29.             for (int j = offset, k = 0; j < offset + 32; k++, j = j + 2)
  30.                 _string += Convert.ToString(libBytes[j], 2).PadLeft(8, '0') 
  31.                     + Convert.ToString(libBytes[j + 1], 2).PadLeft(8, '0');
  32.         }
  33.         return _string;
  34.     }
  35.     catch (Exception e)
  36.     {
  37.         return e.Message;
  38.     }
  39. }

如果只是想获取汉字的点阵,这里推荐一个非常不错的字模提取工具,是由电子工程师阿哲同学提供的PCtoLCD2002完美版

更新(2008年3月9日):
今天想了一下,发现如果直接对位图上的像素进行分析,其实更简单一些,不仅可以调整字号大小,点阵大小,还可以调整字体。下面附上代码。

  1. public static string GetBitString(string fontFamily, string character, int fontSize, int width, int height)
  2. {
  3.     string _string = "";
  4.     Font f = new Font(fontFamily, fontSize);
  5.     SolidBrush sb = new SolidBrush(Color.White);
  6.     Bitmap bm = new Bitmap(width, height);
  7.     Graphics g = Graphics.FromImage(bm);
  8.     //-2为X轴的偏移量,貌似这个看起来合理一些
  9.     g.DrawString(character, f, sb, new PointF(-2, 0));
  10.    
  11.     //逐行读出像素值,如果为白色(即ARGB="FFFFFFFF",8位16进制数),则为1,反之为0;
  12.     for (int i = 0; i < width; i++)
  13.         for (int j = 0; j < height; j++)
  14.             if (bm.GetPixel(j, i).Name.ToLower() == "ffffffff")
  15.                 _string += "1";
  16.             else
  17.                 _string += "0";
  18.  
  19.     f.Dispose();
  20.     sb.Dispose();
  21.     g.Dispose();
  22.     bm.Dispose();
  23.  
  24.     return _string;
  25. }
[ 分类: 学习 ] 由 Pan 发表于 March 8, 2008 10:12 pm  固定链接 

在页面中使用点阵显示汉字》 这篇文章一共有0 条评论   我也想说两句

还没有人对这篇文章发表评论,赶紧留一个吧。

RSS feed for comments on this post. TrackBack URI

相关文章:

发表评论