原文连接: http://xiaocai.name/post/cf1f9_82a6e3 ,不过该链接已经不能用了,我是通过百度快照看到的内容,为了方便其他人查询,现将内容完全拷贝到这里。原文内容需要稍作修改即可运行,为了不引起误会,原文内容我只改了效果图,其他文字部分一点没动。

愤怒的小菜

小菜的成长博客
php Imagick写文字图片并自动换行

效果:

代码:

function echoImgAction(){

$text = " 战争网游巨作《坦克世界》领土争夺战将在近日重新开启新的征程。全新地图,多样玩法,更大参战范围;普通玩家、资深高玩以及专业电竞人士都会重装上阵。今天,小编带领大家回忆领土战曾经的吸金之地,全方位感受《坦克世界》领土争夺战带来的全民参战的宏伟壮丽。";

$top = 10;

$left = 5;

$eol = PHP_EOL;

$fontsize = 12;

$fontfile = 'msyh.ttf';

$text = $this->autowrap($fontsize,$fontfile,$text,500);

$canvas = new Imagick();

$canvas->newImage(500, 400, 'white', 'jpg');

$canvas->setImageFormat('png');

$draw = new ImagickDraw();

$draw->setFontSize($fontsize);//设置字体大小

$draw->setFillColor('#7D7B7B');//设置字体颜色

$draw->setFont($fontfile);

$canvas->annotateImage($draw, $left, ($fontsize+2)+$top, 0, $text);

header("Content-Type: image/png");

echo $canvas;

return false;

}

函数:

/**

* 返回一个字符的数组

* @param $str 文字

* @param $charset 字符编码

*/

function chararray($str,$charset="utf-8"){

$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";

$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";

$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";

$re['big5'] = "/[\x01-\x7f]|\x81-\xfe/";

preg_match_all($re[$charset], $str, $match);

return $match;

}

/**

* 返回一个字符串在图片中所占的宽度

* @param $fontsize 字体大小

* @param $fontangle 角度

* @param $ttfpath 字体文件

* @param $char 字符

*/

function charwidth($fontsize,$fontangle,$ttfpath,$char){

$box = @imagettfbbox($fontsize,$fontangle,$ttfpath,$char);

$width = max($box[2], $box[4]) - min($box[0], $box[6]);

return $width;

}

/**

* 根据预设宽度让文字自动换行

* @param $fontsize 字体大小

* @param $ttfpath 字体名称

* @param $str 字符串

* @param $width 预设宽度

* @param $fontangle 角度

* @param $charset 编码

*/

function autowrap($fontsize,$ttfpath,$str,$width,$fontangle=0,$charset='utf-8'){

$_string = "";

$_width = 0;

$temp = $this->chararray($str);

foreach ($temp[0] as $k=>$v){

$w = $this->charwidth($fontsize,$fontangle,$ttfpath,$v);

$_width += intval($w);

if (($_width > $width) && ($v !== "")){

$_string .= PHP_EOL;

$_width = 0;

}

$_string .= $v;

$w = 0;

}

//$_string = mb_convert_encoding($_string, "html-entities","utf-8" );

return $_string;

}

posted on 2015-09-19 20:22  饭前码字  阅读(2021)  评论(0)    收藏  举报