在 PHP 中用描点法“绘制”中文
前言:
为了实现更多的自动控制,可以使用CGICommon Gateway Interface)程序来实现这些功能。 对于计数器和实时数据统计、发布,我们可以用图片来完成。在图片中输出文字。 //http头,告诉浏览器,这是一个GIF图片 上面示例,在400×300的图片上,自点10,10)开始,绘制12磅的"1234567890"。你有没有注意到这张图片的大小是:251字节!你也可以试试其他的输出格式。 图片的大小,与图片中非背景象素点数有关,跟输出多少象素无关。 然而,有一个问题。 如何解决?! 好,来吧,我们一起来画字! 画字,首先要知道怎么画。 在某个坐标上显示一个某种颜色的点的函数是: header ("Content-type: image/gif"); 也就是说,我们只要获取某个汉字的所有点的信息,我们就能够通过这个函数,输出那个汉字。 在文件chs16.fon里,保存的,是国标区位码表国家标准信息交换用汉字编码基本字符集GB-2312)。它是汉字的点阵字库。WIN98系统中,此文件在c:windowscommand下。如果你要把它放在UNIX系统下使用,请注意大小写。如果没有,你可以在文末找到链接。) 从chs16.fon里,我们可以读取汉字的点阵数据。每个汉字,都是由16×16个点构成的。笔划走过的地方,点的值为1,否则为0;每个点占用一个位,每8个点构成一个字节。那么,一个汉字,就需要16×16÷8=32)字节。 下面这个实例,是为了说明字符点阵的表示方法。
但,我们如何知道到哪里去读某个汉字的点阵数据呢? 一般的字符,比如ASCII码,是用数字0--127即二进制00000000到01111111)来表示,而中文,则是用两个高位为1的字节(100000000 100000000)表示。如: 半角字符"A",机内码为 (01000001)(它实际上是ASCII码值)。 前面已经讲了一个汉字,在表中要占用32字节,所以,我们定义了一个含有32个元素的数组: 接下来的问题,某一个字符,到底保存在文件的什么位置呢? 由于一个汉字用了32个字节,而GB-2312区位码表表有94行、94列,那么,只要知道该字符在表中是第几个,再乘以32就行了。 好,我们开始编程吧!
下面,我给出一个测试实例:
相关附件1:chs16.fon 本地下载 作者联系方式: 注:本文章为原创文章,版权归文章作者与超越PHP网站所有,未经本站同意,禁止任何商业转载。非盈利网站及个人网站转载请注明出处,谢谢合作! | ||||||||||||||||||||||||||||||||||||||||||||||||||||
(04-Jul-2003 07:46 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
感谢 LuciferStar 为该文章做出的努力。 |
lanhuai 06-Jul-2003 10:06 |
|
这篇文章太好了,收藏先! 一直都没时间研究PHP的图像处理方面, 但能看到这样好的文章真是太好了,谢谢! |
static 07-Jul-2003 12:06 |
|
呃...Avenger 老大 代码是我有话的呃 虽说是优化也是翻新重写了 不过 LuciferStar 用这种方式 真的是别出心裁 |
static 07-Jul-2003 12:09 |
|
唉 不好意思看错了 要有话后的代码去论坛吧 http://be10.ods.org/avenger/bbs/index.php?s=&act=ST&f=6&t=1141&st=0 |
labobooo 16-Oct-2003 01:59 |
|
如何让中文显示不同字体 |
LuciferStar 24-Oct-2003 07:00 |
|
由于使用的是点阵字库 所以,如果你要用不同的字体 需要调用不同的字体点阵字库。 |
ljcao 25-Nov-2003 10:18 |
|
Very Good ! Collect Item |
GArrison 12-Mar-2004 07:11 |
|
不支持换行? |
ljljl 28-Apr-2004 12:59 |
|
;k;k;k;khhhhhhhhhhhhh |
sunknight 25-Nov-2004 02:43 |
|
$fontsize = 16; for($x0=0;$x0<$fontsize;$x0++) { for($y0=0;$y0<$fontsize;$y0++) { $locBit= $x0 * $fontsize + $y0 ; $locByte = floor ( $locBit / 8 ); $locInByte = $locBit % 8 ; if((ord($buffer[$locByte])>>(7- $locInByte)) & 0x01) { imagesetpixel($image,$x0+$x, $y0+$y,$color); } } } 对于16点阵的字体 用这个也可以的感觉更容易理解些 |
axolo 05-Jan-2005 04:16 |
|
回到DOS时代的中处理,很久之前我也用C做同样的事情!仿佛回到了当年…… |
ChenDian 25-May-2005 10:19 |
|
使用iconv来显示中文的方法: header("Content-type: image/jpeg"); $im =imagecreate(400,400); $white = imagecolorallocate($im,255,255,255); $black = imagecolorallocate($im, 0,0,0); //首先将内码转成UTF-8,然后使用中文的TTF字库使用imagettftest函数, //就可以在图片上输出中文了! // Replace path by your own fontpath //不转码的情况 imagettftext($im, 40, 0, 10, 350, $black,"STKAITI.TTF", "This is a test.测试"); //转成UTF-8的情况 imagettftext($im,40, 90, 200, 320, imagecolorallocate($im, 0,255,0),"STHUPO.TTF", iconv("GB2312","UTF-8","哈哈,以后 就以用了!")); imagettftext($im, 40, 0, 13, 202, $black ,"STKAITI.TTF", iconv("GB2312","UTF-8", "This is a test.测试")); imagettftext($im, 40, 0, 10, 200,imagecolorallocate($im, 255,255,0), "STKAITI.TTF", iconv("GB2312", "UTF-8", "Thisis a test. 测试")); imagettftext($im, 30, -10, 10,20, imagecolorallocate($im, 0,0,255),"SURSONG.TTF", iconv("GB2312","UTF-8","终于可以显示中文字了,哈哈!")); imagettftext($im, 30, 10, 10, 150, imagecolorallocate($im, 255,0,0),"STCAIYUN.TTF", iconv("GB2312","UTF-8","终于可以显示中文字了,哈哈!")); imagejpeg($im); imagedestroy($im); ?> |
PHP之友评论