PHP使用imagettfbbox计算中文字体范围
2020-05-10 本文已影响0人
成长开发者
最近做一个出租车广告管理系统。需要把用户输入的文字转成图片。图片又需要根据展示特效,采取不同的处理逻辑。比如:单行文本,连续左、右移动,需要把文字转成一张图片,不用考虑显示屏宽读。如果是左移、右移、上帘、立即显示等效果,需要考虑文字生成的图片有没有超过一屏宽度,超过的需要另外生成一张图片。
我通过长时间的摸索,忍受领导的批评指责,期间我有提到辞职不干,但是生活还得继续,代码仍然还要敲。
我采用的处理逻辑是,先计算单个文字的宽度,然后把一个文字生成的这张小图片,相继合并在一起,这里用到了这个类库 intervention/image。在合并的时候,可以灵活考虑图片是否超过宽度或者高度。
现在效果还算说得过去。(没有实现 文字的加粗、斜体效果,加粗、斜体效果需要使用相应的字体,比如宋体-粗体、宋体-斜体、宋体-粗斜体,这些字体网上都没有相应资源)
private function calculateTextBox($font_size, $font_angle, $font_file, $text) {
$box = imagettfbbox($font_size, $font_angle, $font_file, $text);
if( !$box ){
return false;
}
$min_x = min( array($box[0], $box[2], $box[4], $box[6]) );
$max_x = max( array($box[0], $box[2], $box[4], $box[6]) );
$min_y = min( array($box[1], $box[3], $box[5], $box[7]) );
$max_y = max( array($box[1], $box[3], $box[5], $box[7]) );
$width = ( $max_x - $min_x );
$height = ( $max_y - $min_y );
$left = abs( $min_x ) + $width;
$top = abs( $min_y ) + $height;
preg_match("/[\x{4e00}-\x{9fa5}]/u",$text,$matches);
if(!empty($matches)) {
$width -= 5; // 中文减去 5 像素
if($width < $font_size){ // 如果宽度小于字体大小,强制设定为字体大小宽度
$width = $font_size;
}
if(in_array($text, ['一','二'])){
$height = $width;
}
}else{
$height += 3;
}
return array(
'width' => $width,
'height'=> $height
);
}