php实现在限定区域里自动调整字体大小的类实例

5年以前  |  阅读数:665 次  |  编程语言:PHP 

本文实例讲述了php实现在限定区域里自动调整字体大小的类。分享给大家供大家参考。具体如下:

这里的php类imagefittext.class.php实现在限定的区域里自动调整字体大小的功能。


    <?php
    // Image Fit Text Class 0.1 by ming0070913
    CLASS ImageFitText{
     public $font, $fontsize, $width, $height;
     public $step_wrap, $step_fontsize;
     public function __construct($font, $step_wrap=1, $step_fontsize=1){
      $this->font = $font;
      $this->step_wrap = $step_wrap>1?$step_wrap:1;
      $this->step_fontsize = $step_fontsize>1?$step_fontsize:1;
     }
     function fit($width, $height, $text, $fontsize, $min_fontsize=5, $min_wraplength=0){
      $this->fontsize = & $fontsize;
      $text_ = $text;
      while($this->TextHeight($text_)>$height && $fontsize>$min_fontsize)
       $fontsize -= $this->step_fontsize;
      while(($this->TextWidth($text_)>$width || $this->TextHeight($text_)>$height) && $fontsize>$min_fontsize){
       $fontsize -= $this->step_fontsize;
       $wraplength = $this->maxLen($text);
       $text_ = $text;
       while($this->TextWidth($text_)>$width && $wraplength>=$min_wraplength+$this->step_wrap){
        $wraplength -= $this->step_wrap;
        $text_ = wordwrap($text, $wraplength, "\n", true);
        //To speed up:
        if($this->TextHeight($text_)>$height) break;
        if($wraplength<=$min_wraplength) break;
        $wraplength_ = $wraplength;
        $wraplength = ceil($wraplength/($this->TextWidth($text_)/$width));
        $wraplength = $wraplength<($min_wraplength+$this->step_wrap)?($min_wraplength+$this->step_wrap):$wraplength;
       }
      }
      $this->width = $this->TextWidth($text_);
      $this->height = $this->TextHeight($text_);
      return array("fontsize"=>$fontsize, "text"=>$text_, "width"=>$this->width, "height"=>$this->height);
     }
     function maxLen($text){
      $lines = explode("\n", str_replace("\r", "", $text));
      foreach($lines as $line)
       $t[] = strlen($line);
      return max($t);
     }
     function TextWidth($text){
      $t = imagettfbbox($this->fontsize, 0, $this->font, $text);
      return $t[2]-$t[0];
     }
     function TextHeight($text){
      $t = imagettfbbox($this->fontsize, 0, $this->font, $text);
      return $t[1]-$t[7];
     }
    }
    ?>

使用范例如下:


    <?php
    // Image Fit Text Class 0.1 by ming0070913
    // Example File
    include "imagefittext.class.php";
    // Settings :
    // The text
    $text = "PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML. If you are new to PHP and want to get some idea of how it works, try the introductory tutorial. After that, check out the online manual.";
    // The maximun width
    $width = 200;
    // The maximun height
    $height = 100;
    // Position of the text and the box
    $x1 = 50;
    $y1 = 50;
    // The starting font size
    $fontsize = 10;
    // The minimun font size. The script will stop if it cannot fit the text even with this size.
    $min_fontsize = 3;
    // The minimun wrap length for each line. The script will try another font size if it cannot fit the text even with this wrap length.
    $min_wraplength = 0;
    // The font
    $font = "arial.ttf";
    // The space between the box and the text. It's independent to the script which can be ignored
    $padding = 3;
    // If the script cannot fit the text for certain wrap length, it will try the wrap length again with the reduction in this value.
    // It reduce the accuracy, but will slightly speed up the process.
    $step_wrap = 1;
    // If the script cannot fit the text for certain font size, it will try the the font size again with the reduction in this value.
    // It reduce the accuracy, but will slightly speed up the process.
    $step_fontsize = 1;
    // Create a image
    $im = @imagecreatetruecolor($width+$x1*2, $height+$y1*2+80) or die('Cannot Initialize new GD image stream');
    // Start the timer
    $time_start = microtime_float();
    // The class
    $imagefittext = new ImageFitText($font, $step_wrap, $step_fontsize);
    // Fit the text
    // It returns the result in a array with "fontsize", "text", "width", "height"
    $fit = $imagefittext->fit($width-$padding*2, $height-$padding*2, $text, $fontsize, $min_fontsize, $min_wraplength);
    // Stop the timer
    $time = round(microtime_float()-$time_start, 3);
    $white = imagecolorallocate($im, 255, 255, 255);
    // Draw a box
    imagerectangle($im, $x1, $y1, $x1+$width, $y1+$height, $white);
    // Write the text            +8 because the text will move up originally
    imagettftext($im, $fit['fontsize'], 0, $x1+$padding, $y1+$padding+8, $white, $font, $fit['text']);
    // Print some info. about the text
    imagestring($im, 5, $x1, $y1+$height+30, 'Fontsize : '.$fit['fontsize'], $white);
    imagestring($im, 5, $x1, $y1+$height+45, 'Text Size : '.$fit['width']."x".$fit['height'], $white);
    imagestring($im, 5, $x1, $y1+$height+60, 'Box Size : '.($width-$padding*2)."x".($height-$padding*2), $white);
    imagestring($im, 5, $x1, $y1+$height+75, 'Time used : '.$time.'s', $white);
    // Print the image
    header ('Content-Type: image/png');
    imagepng($im);
    imagedestroy($im);
    function microtime_float(){ // Timer
     list($usec, $sec) = explode(" ", microtime());
     return ((float)$usec + (float)$sec);
    }
    ?>

希望本文所述对大家的php程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例