php生成缩略图,文本转换成图形
这是一款老外的经典的php生成缩略图类函数,文件灵活实用,可以生成任何风格的图片,并且可以把文本转换成图形.
php生成缩略图,文本转换成图形实例代码如下:
- 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_, $text="", $attributes=false, $width=0, $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, "<br>");
- $text = split("<br>", $text );
- } else if ( $all === true ) {
- $temp = array();
- for ( $i=0; $i<strlen($this->text); $i++ )
- {
- array_push ( $temp, mb_substr($this->text, $i, 1, "utf-8") );
- }
- $text = array();
- $count_width = 0;
- $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_width = 0;
- $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; } }
- }
- }
- //开源代码phpfensi.com
- //调用 方法代码如下:
- $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();