php文本转图片的若干问题

by muzik on 2008-05-02

很多社区都有一套所谓的关键词审查制度。PHPBB、Discuz等社区软件,是把帖子中出现的”不雅词汇”替换成星号或者别的什么符号,这虽然会让我们经常看到” @*天*地*大家@ “或者” @依*@ “这样的火星词,但至少,还能看到。

在天涯却又是另外一番情况。如果帖子里有”违禁词汇”的话,一般就会发不出去,偶尔的,虽然发出去了,但却会得到一个提示,声明因为文中含有违禁词汇,需要经过人工审查方能出现云云。

某种程度上来说,天涯这种特色文化也是有好处的,至少,有助于发扬我们古文中通假字的传统,有时候,还能看到词字的倒置用法。前段时间carrefour话题沸扬的时候,爱青们的文章里充斥着”嘉乐福”、”福乐家”、”乐家复”,如此种种。我曾为此嘲笑一位朋友说:可叹楼上的小岛兄,爱国也爱到被删帖的地步了–怕是别人还不乐意要你爱罢。

只是,发帖总要几次三番修改可能的过滤词,却还是发布出去–那些过滤词的名单是全然未知的。这种行为和自宫也没太大差别,想到这一点就让人心头抑郁。

于是写了 “text2img”:http://efrees.com/text2img 这么一个东西,把文本转成一张图片,发帖时不惮麻烦,以图片附件形式发布。

h3. 文字写入图片


$im = imagecreatetruecolor($width,$height); //创建指定尺寸的图片
imageantialias($im,false); //取消防锯齿功能
$white = imagecolorallocate($im, 255, 255, 255); //白色
$textcolor = imagecolorallocate($im, 0, 0, 0); //黑色
imagefilledrectangle($im,1,1,$width-2,$height-2,$white); //用白色填充图片,并留下1px黑色边框
imagefttext($im,$font_size,0,$left_margin, $top_margin,$textcolor,$font_file,$text);//写入文字

 

h3. 文本换行

在把文字写入图片的时候,并不会自行的按照图片宽度来给文本换行,所以需要先自己给文本换行。
基本的思路是,按设置好的行宽来切分每一行。
如果全是中文字符可以用 @str_split($line,$maxlen*3)@ ,但多数情况下,文本里会有英文或半角字符。还是使用MSF比较安全。


$maxlen=50;//设置最大行宽50个字
DEFINE('EC','UTF-8') ;
$lines=explode("\r\n",$text);//把文本按行切开
$newlines=array();
foreach ($lines as $line) {
   $line=preg_replace("!^[ ]+!"," ",$line); //移除行首重复的空格
   $newlines = array_merge($newlines,mb_str_split($line,$maxlen,EC));
}
$text=implode("\r\n",$newlines);

 

MSF没有str_split的对应函数,需要自己写一下


function mb_str_split($text,$split=1,$encoding='UTF-8') {
   $array = array();
   for ($i = 0; $i <= mb_strlen($text,$encoding); $i += $split) {
      $array[] = mb_substr($text, $i, $split,$encoding);
   }
   return $array;
}
 

h3. 计算图片高度

一般来说,图片的宽度是可以固定的,也是必须加于限制的。文章的长度自然决定了图片的高度,除预留的padding之外,需先计算出文本区的高度。


$box = imageftbbox($font_size, 0, $font_file, $text);
$content_height = $box[1] - $box[7];

 

h3. 计算行宽

允许自定义文字大小或图片宽度的话,每行允许的字数,就不能固定预设了。需要用允许的文本宽度去除单字宽度。我有点搞不明白如何精确的得到单字宽度,只能选一个字画出文本框,取得它的宽度。但是,这种方式得到的值,不同的字结果是不一样的。比如,“一”的高度和“丨”的宽度明显就特别小。此外,如果画两个字的文本框,框宽除两字的字宽之外,还会有一定的剩余,应该是字间距。这个间距也随字体大小而不同,换算关系不明。


$max_width=800;
$box = imageftbbox($font_size, 0, $font_file, "整");
$individual_width = $box[2] - $box[0];
$maxlen=floor(($max_width-$left_margin*2)/$individual_width);

 

Related posts:

  1. 网易2009校园招聘擂台赛 网易2009校园招聘擂台赛开赛了。这种线上招聘,说不上有太多新意。但是,由门户网站来搞,却还是让人眼前一亮。到目前为止,从乖乖的漫画专栏,到盗版豆瓣小组的购买冰岛活动,网易越来越多的体现出亲民的一面,亲近网民的一面。 网易2009校园招聘擂台赛是和网易2009年校园招聘同步推出的大型线上活动。网易网站部将通过此次校园招聘面向应届毕业生招聘13类共35个左右职位。 所有应聘者将在网上注册生成个人页面,并在指定时间内参与线上统一笔试。跟普通网申不同的是,选手的信息和答题情况将展现在个人页面上,并可以获得网友的 支持,也可以选择回答网友的出题。我们将从支持率最高的20位选手中选出6名人气王,提前视频面试并发放至少1个offer。其他喜欢低调不爱拉票的同学 也不用担心,你响当当的才能和优势同样会为你赢得offer青睐,首轮提前offer发放后各职位将单独通知后续面试事宜并发放其他offer! 但是,哈哈,我实在是太不厚道了,一打开这个活动的页面,我还以为在搞恐怖片cosplay。投票排名第一的那位兄台,实在是三分不像人,七分倒像鬼…. 其他几位么,呵呵,哈哈…没人想过应该好好的拍一张相片的呢?...
  2. libxml2 encoding error : output conversion failed due to conv error Anemone是一个用Ruby写的Web Spider,在使用它爬取一个网站的时候,从入口页面进去,读不到任何链接。列出页面源码得到如下提示: encoding error : output conversion failed due to...
  3. CakePHP 实例教程: Categories Acts as Tree Tree是CakePHP 1.2的核心Behaviors之一,可以用来轻易的实现无限极分类,并呈现树状列表。 图片来源:Tree traversa,WIKIPEDIA 基础实例 建立数据表 CREATE TABLE `categories` (...

{ 2 comments… read them below or add one }

greencard November 15, 2008 at 02:13

Why this web site do not have other languages support?

Reply

Forum Reklamowe February 24, 2010 at 02:00

Thanks for the informative post. It helped me a lot. May the Force be with you.
Tekst naprawde dobry, niemniej jednak forum reklamowe to slowa ktore powinienes ujac w swoim opisie. Forum reklamowe

I love your blog! It’s wonderful! Great pics!

Reply

Leave a Comment

Previous post:

Next post: