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
        );
    }
上一篇下一篇

猜你喜欢

热点阅读