- 打印本文 关闭窗口
- 在 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 - 打印本文 关闭窗口