php生成缩略图(文本转换成图形)

作者:袖梨 2022-06-24

copyright   : smart-info limited. all right reserved.
 author      : jacky cheung
 version     : 1.1
 create date : 24 september 2008
 last modify : 15 march 2009
*/

class gd
{
 var $font_face   = "";
 var $text   = "";
 var $size    = 12;
 var $color   = "#000000";
 var $angle   = 0;

 var $width   = 0;
 var $height   = 0;
 var $line_height = 0;
 
 var $type   = "png";
 var $chmod   = 0777;
 var $bg_color  = "#ffffff";
 var $quality  = 95;
 var $antialias  = true;
 
 var $x    = 0;
 var $y    = 0;
 

 /*___| convert text to image |___*/
  public function text2image ( $font_face="", $text="", $attributes=false, $, $all=false )
  {
   $this->font_face  = $font_face;
   $this->text   = $text;
   $this->width  = $width;
   $this->size   = 12;
   $this->color  = "#000000";
   $this->angle  = 0;
   $this->line_height = 0;
   $this->setprop ( $attributes );
   
   if ( $this->width == 0 )
   {
    return $this->convert_text2image ( $this->text, $this->check_text_width( $this->text ) );
   } else {
    // word wrap
    if ( $all === false )
    {
     $text = split(" ", $this->text);
     $text = $this->word_wrap($this->text, $this->width, "
");
     $text = split("
", $text );
    } else if ( $all === true ) {
     $temp = array();
     for ( $i=0; $itext); $i++ )
     {
      array_push ( $temp, mb_substr($this->text, $i, 1, "utf-8") );
     }
     $text = array();
     $count_;
     $i = 0;
     foreach ( $temp as $k => $t )
     {
      $prop = $this->check_text_width($t);
      if ( $count_width + floatval($prop["width"]) < $this->width )
      {
       $text[$i] = $text[$i] . $t;
       $count_width += floatval($prop["width"]);
      } else {
       $count_;
       $i++;
       $text[$i] = "";
      }
     }
    }
    
    $img = array();
    foreach ( $text as $k => $t )
    {
     $img[$k] = $this->convert_text2image ( $t,  $this->check_text_width( $t ) );
    }
    
    $w = 0;
    $h = 0;
    foreach ( $img as $k => $v )
    {
     $w = (imagesx($img[$k]) > $w) ? imagesx($img[$k]) : $w;

     if ($this->line_height == 0 ) $h += imagesy($img[$k]);
     else $h += ($k < count($img)-1) ? $this->line_height : imagesy($img[$k]);
    }
    
    $base_img = $this->createtransparent($w, $h);
    $locy = 0;
    foreach ( $img as $k => $v )
    {
     if ($k > 0)
     {
      $locy = ($this->line_height == 0) ? $locy + imagesy($img[$k]) : $locy + $this->line_height;
     }
     $base_img = $this->attachgdimage ( $img[$k], $base_img, array ("x"=>0, "y"=>$locy) );
    }
    return $base_img;
   }
  }
  private function word_wrap( $str, $width, $break )
  {
   $formatted = '';
   $position = -1;
   $prev_position = 0;
   $last_line = -1;
   
   /// looping the string stop at each space
   while( $position = mb_stripos( $str, " ", ++$position, 'utf-8' ) ) {
    if( $position > $last_line + $width + 1 ) {
     $formatted.= mb_substr( $str, $last_line + 1, $prev_position - $last_line - 1, 'utf-8' ).$break;
     $last_line = $prev_position;
    }
    $prev_position = $position;
   }
   
   /// adding last line without the break
   $formatted.= mb_substr( $str, $last_line + 1, mb_strlen( $str ), 'utf-8' );
   return $formatted;
  }


  public function convert_text2image ( $text, $prop )
  {
   $im   = imagecreatetruecolor ( $prop["width"], $prop["height"] );
   $rgb   = $this->getrgb ( $this->color );
   $color   = imagecolorallocate ( $im, $rgb["red"], $rgb["green"], $rgb["blue"] );
   $img   = $this->createtransparent ( $prop["width"], $prop["height"] );
   imagettftext ( $img, $this->size, $this->angle, 0, $prop["height"] - abs ( $prop["top"] ), $color, $this->font_face, $text );
   return $img;
  }
  public function check_text_width ( $text )
  {
   $prop = array();
   $bbox    = imagettfbbox ( $this->size, $this->angle, $this->font_face, $text );
   $prop["left"]  = $bbox[0];
   $prop["right"]  = $bbox[2];
   $prop["top"] = $bbox[1];
   $prop["bottom"] = $bbox[7];
   $padding  = 2;
  
   $prop["width"]  = abs($prop["left"]) + abs($prop["right"])  + $padding;
   $prop["height"] = abs($prop["top"])  + abs($prop["bottom"]) + $padding;
   
   return $prop;
  }


 /*___| save to image file |___*/
  public function save($gdimage, $filename, $attributes=false)
  {
   $this->type   = "png";
   $this->chmod   = 0777;
   $this->bg_color  = "#ffffff";
   $this->quality  = 95;
   $this->antialias = true;
   
   $this->setprop ( $attributes );
   
   // process
   switch ( strtolower ( $this->type ) )
   {
    case "jpeg":
    case "jpg":
     $gdimage = $this->createbackground($gdimage, imagesx($gdimage), imagesy($gdimage));
     imagejpeg ( $gdimage, $filename, $this->quality );
     break;
    case "gif":
     $gdimage = $this->createbackground($gdimage, imagesx($gdimage), imagesy($gdimage));
     imagegif ( $gdimage, $filename );
     break;   
    case "png":
    default :
     imagepng ( $gdimage, $filename );
     break;
   }
   chmod ( $filename, $this->chmod );
  }


 /*___| create gd background image |___*/
  public function createbackground($gdimage, $width, $height)
  {
   $img = imagecreatetruecolor ( $width, $height );
   $rgb = $this->getrgb ( $this->bg_color );
   $color = imagecolorallocate ( $img, $rgb["red"], $rgb["green"], $rgb["blue"] );
   imagefill ( $img, 0, 0, $color );
   imagecopyresampled ( $img, $gdimage, 0, 0, 0, 0, $width, $height, $width, $height );
   return $img;
  }


 /*___| create gd transparent image |___*/
  public function createtransparent($width, $height)
  {
   $img = imagecreatetruecolor($width, $height);
   imagealphablending($img, false);
   imagesavealpha($img, true);
   $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
   imagefilledrectangle($img, 0, 0, $width, $height, $transparent);
   imagecopyresampled($img, $img, 0, 0, 0, 0, $width, $height, $width, $height);
   return $img;
  }

 
 /*___| load image |___*/
  public function createimagefrom($filename, $alpha=true)
  {
   if ( function_exists ( "exif_imagetype" ) )
   {
    if ( exif_imagetype ( $filename )   == imagetype_jpeg ) { return $this->createfromjpeg ( $filename ); }
    else if ( exif_imagetype ( $filename )  == imagetype_gif  ) { return $this->createfromgif  ( $filename ); }
    else if ( exif_imagetype ( $filename )  == imagetype_png  ) { return $this->createfrompng  ( $filename, $alpha ); }
   }
   else
   {
    if ( strstr ( strtoupper ( $filename )  , ".jpg" )  || strstr ( strtoupper ( $filename ), ".jpeg" )) { return $this->createfromjpeg ( $filename ); }
    else if ( strstr ( strtoupper ( $filename ) , ".gif" )) { return $this->createfromgif ( $filename ); }
    else if ( strstr ( strtoupper ( $filename ) , ".png" )) { return $this->createfrompng ( $filename, $alpha ); }
   }
   return false;
  }
  private function createfromjpeg ( $filename ) { return imagecreatefromjpeg ( $filename ); }
  private function createfromgif  ( $filename ) { return imagecreatefromgif  ( $filename ); }
  private function createfrompng  ( $filename, $alpha=true )
  {
   if ( $alpha )
   {
    list ( $width, $height ) = getimagesize ( $filename );
    $png_img = imagecreatefrompng ( $filename );
    $img = imagecreatetruecolor ( $width, $height );
    imagealphablending ( $img, false );
    imagesavealpha ( $img, true );
    imagecopyresampled ( $img, $png_img, 0, 0, 0, 0, $width, $height, $width, $height );
   } else {
    $img = imagecreatefrompng ( $filename );
   } 
   return $img;
  }
 
 
 /*___| attach background image |___*/
  public function attachbackgroundimage ( $gdimage, $filename, $attributes=false )
  {
   $this->x = 0;
   $this->y = 0;
   $this->setprop ( $attributes );
  
   $img = $this->createimagefrom ( $filename );
   imagecopyresampled ( $img, $gdimage, $this->x, $this->y, 0, 0, imagesx($gdimage), imagesy($gdimage), imagesx($gdimage), imagesy($gdimage) );
   return $img;
  }


 /*___| attach image |___*/
  public function attachimage ( $source, $target, $filename, $image_attributes=false, $attributes=false )
  {
   $source_img = $this->createimagefrom ( $source );
   $target_img = $this->attachbackgroundimage ( $source_img, $target, $attributes );
   $this->save ( $target_img, $filename, $image_attributes );
  }
  
 
 /*___| attach gd image resource |___*/
  public function attachgdimage ( $gd_source, $gd_target, $attributes=false )
  {
   $this->x  = 0;
   $this->y  = 0;
   $this->width = 0;
   $this->height = 0;
   $this->setprop ( $attributes );
   
   imagealphablending($gd_target, true );
   imagealphablending($gd_source, true );
   imagecopy ( $gd_target, $gd_source, $this->x, $this->y, 0, 0, imagesx($gd_source), imagesy($gd_source) );
   return $gd_target;
  }
 
 
 /*___| get rgb color |___*/
  public function getrgb($hex)
  {
   $rgb["red"]   = hexdec ( substr ( $hex, 1, 2 ) ) ;
   $rgb["green"] = hexdec ( substr ( $hex, 3, 2 ) ) ;
   $rgb["blue"]  = hexdec ( substr ( $hex, 5, 2 ) ) ;
   return $rgb;
  }
 
 
 /*___| set properties |___*/ 
  private function setprop ( $attributes=false )
  {
   if ( $attributes ) { foreach  ( $attributes as $key => $value ) { $k = strtoupper ( $key ); $this->$k = $value; } }
  }
}

//调用 方法

 代码如下 复制代码
$imgresize = new imagetransform();
$imgresize->sourcefile = $source.$file;
$imgresize->targetfile = $destination.$file;
$imgresize->chmodvalue = 0777; 
$imgresize->resizetowidth = $tw;
$imgresize->resizetoheight = $th;
$imgresize->jpegoutputquality = 100;
$imgresize->resizeifsmaller = false;
$imgresize->resize();

?>

相关文章

精彩推荐