设为首页 收藏本站
查看: 508|回复: 0

[经验分享] PHP总的画图功能----绘制字符之中文的绘制~~

[复制链接]

尚未签到

发表于 2015-8-28 13:08:44 | 显示全部楼层 |阅读模式
绘制中文

    思想:找到相应点的坐标,将所有点连接起来就是一个汉字,如老式的点阵打印机
   我们绘制中文,就需要获取这个汉字所有的点的信息,把他们描绘出来。绘制中文需要有汉字的点阵字库 DSC0000.gif ,字库里面保存的是国际区位码,我们从这里面读取汉字信息(chs16.fon字库文件)。  
   首先,我们要知道,汉字是由16*16个点构成的,有点的位置为1,否则为0,如下图: DSC0001.jpg
C字符的信息如下:
第0行:00000000
第1行:00111110
第2行:01110000
第3行:01110000
第4行:01110000
第5行:01110000
第6行:00111110
第7行:00000000
用双循环去找点的位置,并画出来。8行8列。
中文是用2个高位为1的ASCII码表示。

区位码与机内码的换算公式为
【区位码】+(10100000 10100000)=【机内码】。即:
    区位码0 + (10100000) = 机内码0;
    区位码1 + (10100000) = 机内码1;
这样的话,点阵数据,就可以通过汉字"机内码"-> "区位码"进行索引、查找。
由于一个汉字用了32个字节,而GB-2312区位码表表有94行、94列,那么,只要知道该字符在表中是第几个,再乘以32就行了。
用区位码就可以查找在区位码表中第几个了,区位码表示(区,位)

步骤:

1.用ORD可以获取一个字元的机内码,再通过上面的换算公式,得出区位码(一个汉字的第一个字元是区的信息,第二个是位的信息)
2.通过区位码,查出字符在字库中的位置,并得出点阵信息
3.把点阵信息放入数组
4.如果为1,在相应的位置绘制点

原理就这么简单:)

下面给一段代码:是别人的代码
/*************************************
*     文件名:'draw1.0.inc.php
**    中文显示点阵输出   version 1.0
**    只提供简单的操作:输出默认大小的纯中文字符串到图片的坐标(0,0)上
**    更多功能,请见下一版本。
*
****************************************/
function draw($image,$string,$color)
{
   $fp=fopen("chs16.fon","rb");//二进制方式读点阵字库chs16.fon
   if (!feof($fp))//如果文件指针到了文件末尾,退出,不要忘记关闭文件
   {
      while($string)//当字符串不为0
      {
         $qh=ord(substr($string,0,1))-0xa0;
      $wh=ord(substr($string,1,2))-0xa0;
/* 这两行代码,其实是获取一个中文的机内码。通过运算到了区位码。*/
         $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();是一个支持正则表达的函数。*/
        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&#215;16点,那么,$x的值设为16,就够了。但,太挤了不是?
     }
  }
  fclose($fp);
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105564-1-1.html 上篇帖子: ExtJS与PHP、MySQL实现存储 下篇帖子: Windows 下 PHP 环境搭建小结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表