美文网首页
PHP使用imagettfbbox计算中文字体范围

PHP使用imagettfbbox计算中文字体范围

作者: 成长开发者 | 来源:发表于2020-05-10 15:13 被阅读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
            );
        }
    

    相关文章

      网友评论

          本文标题:PHP使用imagettfbbox计算中文字体范围

          本文链接:https://www.haomeiwen.com/subject/lusjnhtx.html