打印本文 打印本文  关闭窗口 关闭窗口
在 PHP 中用描点法“绘制”中文
作者:采集员 文章来源:来源于网络 点击数: 更新时间:2005/9/10 14:36:28
(!feof($fp))//如果文件指针到了文件末尾,退出,不要忘记关闭文件
  
{
      while($string)//当字符串不为0
     
{
         $qh=ord(substr($string,0,1))-0xa0;
      $wh=ord(substr($string,1,2))-0xa0;
/* 这两行代码,其实是获取一个中文的机内码。
  substr($string,0,1);是从$string中获取第一个字节,然后,通过ord();将这个字符转换为整数。(由于PHP不支持无符号整数,所以没有这一步转换的话,你就只能得到一个0。)在转换为整数之后,就能进行计算了。机内码减去0xa0(10100000),就得到了区位码。
substr($string,1,2);是获取$string中的第二个字节。*/

         $offset=(94*($qh-1)+($wh-1))*32;
/*得到了汉字的区位值后,就开始计算偏移量了。*/
     fseek($fp,$offset,SEEK_SET);
/*在字库文件$fp中,将文件指针定位到偏移量。*/
         $buffer=preg_split('//', fread($fp,32), -1, PREG_SPLIT_NO_EMPTY);
/* fread($fp,32);是从$fp中读取32个字节数据,然后通过preg_split();分配到数组$buffer中。preg_split();是一个支持正则表达的函数。关于正则表达式,我正在学习中。为什么这样用,我也不知道。PHP手册里有本实例。*/
        for($i=0;$i<16;$i++)              //点阵的行数:16 列数也应该是16
      
for($j=0;$j<2;$j++)             //因为是两个字节,那么,就要一个一个地画了
       
for($k=0;$k<8;$k++)          //每个字节,都有8个点的数据
     
if(((ord($buffer[$i*2+$j])>>(7-$k))&0x01))//如果这个点的值为1,输出;否则,没有
     
{
         imagesetpixel($image,$x+8*$j+$k, $i, $color);
             }
      $string=substr($string,2); //中文由两个字节表示,所以,输出一个汉字后,就要去掉两个字节。
      $x=24; //一个汉字输出结束,空开一点,给下一个汉字。因为这个汉字是16×16点,那么,$x的值设为16就够了。但太挤了不是
     }
  }
  fclose($fp);
 }

下面,我给出一个测试实例:


<?php
header ("Content-type: image/gif");
include 'draw1.0.inc.php';
$im = imagecreate (400, 300);
$black = imagecolorallocate ($im, 0, 0, 0);
$string="中文";
drawer($im,$string);
imagepng ($im);
imagedestroy ($im);
?>


对于这个函数,我们还可以进行扩充,以实现不同的效果。


相关附件1:chs16.fon 本地下载
相关附件2:代码实例打包下载

一个实时用户留言板留言数量统计表实例:
http://medlem.spray.se/letmegetone/messageboard/userinfo.htm

作者联系方式:
Homepage: http://medlem.spray.se/letmegetone
E-mail: singlestudio@hotmail.com

上一页  [1] [2] 



打印本文 打印本文  关闭窗口 关闭窗口