PHP-GD 使文本换行上的所有字体的行高兼容

Posted

技术标签:

【中文标题】PHP-GD 使文本换行上的所有字体的行高兼容【英文标题】:PHP-GD make line height compatible across all fonts on text wrap 【发布时间】:2013-02-20 15:10:51 【问题描述】:

好的,我正在使用 jquery 开发一个简单的生成器。用户输入他/她选择的文本,选择字体、字体颜色和字体大小。所有这些属性都实时显示在单独的 div 上(实时预览)。

我现在需要将生成的预览保存为图片。为此,我使用 php GD 库。一切正常,但使用一些字体,一切都搞砸了。

在第一张图片中,一切看起来都很好,但在第二张图片中,行高只是搞砸了。

这是我用来处理属性的 php 脚本

    <?php
        //Width and height of desired image  
        $width = 320;
        $height= 320;

       //Create an image with specified height and width
       $main_img = ImageCreate($width, $height);
       $mx = imagesx($main_img); 
       $my = imagesy($main_img); 

       //Capture values from form
       $main_text = $_POST['rtext'];
       $main_text_size =  $_POST['rfsize'];
       $color = $_POST['rcolor']; 
       $mt_f = $_POST['rfont'];
       $main_text_x = ($mx/2);


       // more code here      


       //wrap text if text too long
       $words = explode(' ', $main_text); 
       $lines = array($words[0]); 
       $currentLine = 0; 
       for($i = 1; $i < count($words); $i++) 
        
            $lineSize = imagettfbbox($main_text_size, 0, $mt_f, $lines[$currentLine] . ' ' . $words[$i]); 
            if($lineSize[2] - $lineSize[0] < $mx) 
             
                $lines[$currentLine] .= ' ' . $words[$i]; 
             
            else 
             
                $currentLine++; 
                $lines[$currentLine] = $words[$i]; 
             
        
       $line_count = 1; 

       // Loop through the lines and place them on the image 
       foreach ($lines as $line) 
        
           $line_box = imagettfbbox($main_text_size, 0, $mt_f, "$line"); 
           $line_width = $line_box[0]+$line_box[2]; 
           $line_height = $line_box[1]-$line_box[7]; 
           $line_margin = ($mx-$line_width)/2; 
           $line_y = (($line_height+12) * $line_count); 
           imagettftext($main_img, $main_text_size, 0, $line_margin, $line_y, $main_text_color, $mt_f, $line); 

           // Increment Y so the next line is below the previous line 
           $line_count ++; 
       
      header("Content-type: image/png");

      //code to download the image

    ?>

有没有一种方法可以修改我包装文本以适应所有字体的代码部分?喜欢根据字体自动计算行高?

谢谢,任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

我在 phpclasses imagefittext.class.php http://www.phpclasses.org/browse/file/41869.html 找到了一个非常有用的课程。我还发现了一个使用类http://www.phpclasses.org/browse/file/41870.html 实现的示例脚本。这正是我想要的。

完美运行!!!1

【讨论】:

以上是关于PHP-GD 使文本换行上的所有字体的行高兼容的主要内容,如果未能解决你的问题,请参考以下文章

内联元素上的 CSS 行高

wpf datagrid row height 行高自动计算使每行行高自适应文本

如何用python改写csv的行高和列宽

聊一聊 Sketch 与 iOS 文字的行高

在移动电子邮件客户端上显示时,文本上的行高过高

怎样设置datagrid的行高