您好,欢迎访问一九零五行业门户网

图片类 支持GD和Imagick,gif动画类型

1. [文件]     image.class.php                                <?php namespace ybl; class image{ /* 驱动相关常量定义 */ const image_gd = 0; //常量,标识gd库类型 const image_imagick = 1; //常量,标识imagick库类型 /* 缩略图相关常量定义 */ const image_thumb_scale = 0 ; //常量,标识缩略图等比例缩放类型 const image_thumb_filled = 1 ; //常量,标识缩略图缩放后填充类型 const image_thumb_center = 2 ; //常量,标识缩略图居中裁剪类型 const image_thumb_northwest = 3 ; //常量,标识缩略图左上角裁剪类型 const image_thumb_southeast = 4 ; //常量,标识缩略图右下角裁剪类型 const image_thumb_fixed = 5 ; //常量,标识缩略图固定尺寸缩放类型 /* 水印相关常量定义 */ const image_water_center = 0 ; //常量,标识居中水印 const image_water_northwest = 1 ; //常量,标识左上角水印 const image_water_north = 2 ; //常量,标识上居中水印 const image_water_northeast = 3 ; //常量,标识右上角水印 const image_water_east = 4 ; //常量,标识右居中水印 const image_water_southeast = 5 ; //常量,标识右下角水印 const image_water_south = 6 ; //常量,标识下居中水印 const image_water_southwest = 7 ; //常量,标识左下角水印 const image_water_west = 8 ; //常量,标识左居中水印 /** * 图片资源 * @var resource */ private $img; /** * 构造方法,用于实例化一个图片处理对象 * @param string $type 要使用的类库,默认使用gd库 */ public function __construct($gif_proess=false,$type = self::image_gd){ /* 判断调用库的类型 */ switch ($type) { case self::image_gd: $class = 'gd'; break; case self::image_imagick: $class ='imagick'; break; default: exit('不支持的图片处理库类型'); } /* 引入处理库,实例化图片处理对象 */ include_once($class.'.class.php'); $class = __namespace__.'\\'.$class; $this->img = new $class($gif_proess); } /** * 打开一幅图像 * @param string $imgname 图片路径 * @return object 当前图片处理库对象 */ public function open($imgname){ $this->img->open($imgname); return $this; } /** * 保存图片 * @param string $imgname 图片保存名称 * @param string $type 图片类型 * @param integer $quality 图像质量 * @param boolean $interlace 是否对jpeg类型图片设置隔行扫描 * @return object 当前图片处理库对象 */ public function save($imgname, $type = null, $quality=80,$interlace = true){ $this->img->save($imgname, $type, $quality,$interlace); return $this; } /** * 返回图片宽度 * @return integer 图片宽度 */ public function width(){ return $this->img->width(); } /** * 返回图片高度 * @return integer 图片高度 */ public function height(){ return $this->img->height(); } /** * 返回图像类型 * @return string 图片类型 */ public function type(){ return $this->img->type(); } /** * 返回图像mime类型 * @return string 图像mime类型 */ public function mime(){ return $this->img->mime(); } /** * 返回图像尺寸数组 0 - 图片宽度,1 - 图片高度 * @return array 图片尺寸 */ public function size(){ return $this->img->size(); } /** * 裁剪图片 * @param integer $w 裁剪区域宽度 * @param integer $h 裁剪区域高度 * @param integer $x 裁剪区域x坐标 * @param integer $y 裁剪区域y坐标 * @param integer $width 图片保存宽度 * @param integer $height 图片保存高度 * @return object 当前图片处理库对象 */ public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null){ $this->img->crop($w, $h, $x, $y, $width, $height); return $this; } /** * 生成缩略图 * @param integer $width 缩略图最大宽度 * @param integer $height 缩略图最大高度 * @param integer $type 缩略图裁剪类型 * @return object 当前图片处理库对象 */ public function thumb($width, $height, $type = self::image_thumb_scale){ $this->img->thumb($width, $height, $type); return $this; } /** * 添加水印 * @param string $source 水印图片路径 * @param integer $locate 水印位置 * @param integer $alpha 水印透明度 * @return object 当前图片处理库对象 */ public function water($source, $locate = self::image_water_southeast,$alpha=80){ $this->img->water($source, $locate,$alpha); return $this; } /** * 图像添加文字 * @param string $text 添加的文字 * @param string $font 字体路径 * @param integer $size 字号 * @param string $color 文字颜色 * @param integer $locate 文字写入位置 * @param integer $offset 文字相对当前位置的偏移量 * @param integer $angle 文字倾斜角度 * @return object 当前图片处理库对象 */ public function text($text, $font, $size, $color = '#00000000',$locate = self::image_water_southeast, $offset = 0, $angle = 0){ $this->img->text($text, $font, $size, $color, $locate, $offset, $angle); return $this; } }
2. [文件] gd.class.php <?php namespace ybl; class gd{ /** * 图像资源对象 * @var resource */ private $img; /** * 图像信息,包括width,height,type,mime,size * @var array */ private $info; public $error; /** * 构造方法,可用于打开一张图像 * @param string $imgname 图像路径 */ private $gif_proess; public function __construct($gif_proess=true) { $this->gif_proess=$gif_proess; } /** * 打开一张图像 * @param string $imgname 图像路径 */ public function open($imgname){ //检测图像文件 if(!is_file($imgname)){ $this->error='不存在的图像文件'; return false; } //获取图像信息 $info = getimagesize($imgname); //检测图像合法性 if(false === $info || (imagetype_gif === $info[2] && empty($info['bits']))){ $this->error='非法图像文件'; return false; } //设置图像信息 $this->info = array( 'width' => $info[0], 'height' => $info[1], 'type' => image_type_to_extension($info[2], false), 'mime' => $info['mime'], ); //销毁已存在的图像 empty($this->img) || imagedestroy($this->img); //打开图像 if(('gif' == $this->info['type'])&&$this->gif_proess){ $this->gif = new gif($imgname); $this->img = imagecreatefromstring($this->gif->image()); } else { $fun = "imagecreatefrom{$this->info['type']}"; $this->img = $fun($imgname); } } /** * 保存图像 * @param string $imgname 图像保存名称 * @param string $type 图像类型 * @param integer $quality 图像质量 * @param boolean $interlace 是否对jpeg类型图像设置隔行扫描 */ public function save($imgname, $type = null, $quality=80,$interlace = true){ if(empty($this->img)){ $this->error='没有可以被保存的图像资源'; return false; } //自动获取图像类型 if(is_null($type)){ $type = $this->info['type']; } else { $type = strtolower($type); } //保存图像 if('jpeg' == $type || 'jpg' == $type){ //jpeg图像设置隔行扫描 imageinterlace($this->img, $interlace); imagejpeg($this->img, $imgname,$quality); }elseif(('gif' == $type)&& !empty($this->gif)){ $this->gif->save($imgname); }else{ $fun = 'image'.$type; $fun($this->img, $imgname); } } /** * 返回图像宽度 * @return integer 图像宽度 */ public function width(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return $this->info['width']; } /** * 返回图像高度 * @return integer 图像高度 */ public function height(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return $this->info['height']; } /** * 返回图像类型 * @return string 图像类型 */ public function type(){ if(empty($this->img)){$this->error='没有指定图像资源'; return false;} return $this->info['type']; } /** * 返回图像mime类型 * @return string 图像mime类型 */ public function mime(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return $this->info['mime']; } /** * 返回图像尺寸数组 0 - 图像宽度,1 - 图像高度 * @return array 图像尺寸 */ public function size(){ if(empty($this->img)) { $this->error='没有指定图像资源'; return false; } return array($this->info['width'], $this->info['height']); } /** * 裁剪图像 * @param integer $w 裁剪区域宽度 * @param integer $h 裁剪区域高度 * @param integer $x 裁剪区域x坐标 * @param integer $y 裁剪区域y坐标 * @param integer $width 图像保存宽度 * @param integer $height 图像保存高度 */ public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null){ if(empty($this->img)){ $this->error='没有可以被裁剪的图像资源'; return false; } //设置保存尺寸 empty($width) && $width = $w; empty($height) && $height = $h; do { //创建新图像 $img = imagecreatetruecolor($width, $height); // 调整默认颜色 $color = imagecolorallocate($img, 255, 255, 255); imagefill($img, 0, 0, $color); //裁剪 imagecopyresampled($img, $this->img, 0, 0, $x, $y, $width, $height, $w, $h); imagedestroy($this->img); //销毁原图 //设置新图像 $this->img = $img; } while(!empty($this->gif)&&$this->gifnext()); $this->info['width'] = $width; $this->info['height'] = $height; } /** * 生成缩略图 * @param integer $width 缩略图最大宽度 * @param integer $height 缩略图最大高度 * @param integer $type 缩略图裁剪类型 */ public function thumb($width, $height, $type = image::image_thumb_scale){ if(empty($this->img)){ $this->error='没有可以被缩略的图像资源'; return false; } //原图宽度和高度 $w = $this->info['width']; $h = $this->info['height']; /* 计算缩略图生成的必要参数 */ switch ($type) { /* 等比例缩放 */ case image::image_thumb_scale: //原图尺寸小于缩略图尺寸则不进行缩略 if($w < $width && $h < $height) return; //计算缩放比例 $scale = min($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $x = $y = 0; $width = $w * $scale; $height = $h * $scale; break; /* 居中裁剪 */ case image::image_thumb_center: //计算缩放比例 $scale = max($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $w = $width/$scale; $h = $height/$scale; $x = ($this->info['width'] - $w)/2; $y = ($this->info['height'] - $h)/2; break; /* 左上角裁剪 */ case image::image_thumb_northwest: //计算缩放比例 $scale = max($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $x = $y = 0; $w = $width/$scale; $h = $height/$scale; break; /* 右下角裁剪 */ case image::image_thumb_southeast: //计算缩放比例 $scale = max($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $w = $width/$scale; $h = $height/$scale; $x = $this->info['width'] - $w; $y = $this->info['height'] - $h; break; /* 填充 */ case image::image_thumb_filled: //计算缩放比例 if($w < $width && $h < $height){ $scale = 1; } else { $scale = min($width/$w, $height/$h); } //设置缩略图的坐标及宽度和高度 $neww = $w * $scale; $newh = $h * $scale; $posx = ($width - $w * $scale)/2; $posy = ($height - $h * $scale)/2; do{ //创建新图像 $img = imagecreatetruecolor($width, $height); // 调整默认颜色 $color = imagecolorallocate($img, 255, 255, 255); imagefill($img, 0, 0, $color); //裁剪 imagecopyresampled($img, $this->img, $posx, $posy, $x, $y, $neww, $newh, $w, $h); imagedestroy($this->img); //销毁原图 $this->img = $img; } while(!empty($this->gif)&&$this->gifnext()); $this->info['width'] = $width; $this->info['height'] = $height; return; /* 固定 */ case image::image_thumb_fixed: $x = $y = 0; break; default: $this->error='不支持的缩略图裁剪类型'; return false; } /* 裁剪图像 */ $this->crop($w, $h, $x, $y, $width, $height); } /** * 添加水印 * @param string $source 水印图片路径 * @param integer $locate 水印位置 * @param integer $alpha 水印透明度 */ public function water($source, $locate = image::image_water_southeast,$alpha=80){ //资源检测 if(empty($this->img)) { $this->error='没有可以被添加水印的图像资源'; return false; } if(!is_file($source)) { $this->error='水印图像不存在'; return false; } //获取水印图像信息 $info = getimagesize($source); if(false === $info || (imagetype_gif === $info[2] && empty($info['bits']))){ $this->error='非法水印文件'; return false; } //创建水印图像资源 $fun = 'imagecreatefrom' . image_type_to_extension($info[2], false); $water = $fun($source); //设定水印图像的混色模式 imagealphablending($water, true); /* 设定水印位置 */ switch ($locate) { /* 右下角水印 */ case image::image_water_southeast: $x = $this->info['width'] - $info[0]; $y = $this->info['height'] - $info[1]; break; /* 左下角水印 */ case image::image_water_southwest: $x = 0; $y = $this->info['height'] - $info[1]; break; /* 左上角水印 */ case image::image_water_northwest: $x = $y = 0; break; /* 右上角水印 */ case image::image_water_northeast: $x = $this->info['width'] - $info[0]; $y = 0; break; /* 居中水印 */ case image::image_water_center: $x = ($this->info['width'] - $info[0])/2; $y = ($this->info['height'] - $info[1])/2; break; /* 下居中水印 */ case image::image_water_south: $x = ($this->info['width'] - $info[0])/2; $y = $this->info['height'] - $info[1]; break; /* 右居中水印 */ case image::image_water_east: $x = $this->info['width'] - $info[0]; $y = ($this->info['height'] - $info[1])/2; break; /* 上居中水印 */ case image::image_water_north: $x = ($this->info['width'] - $info[0])/2; $y = 0; break; /* 左居中水印 */ case image::image_water_west: $x = 0; $y = ($this->info['height'] - $info[1])/2; break; default: /* 自定义水印坐标 */ if(is_array($locate)){ list($x, $y) = $locate; } else {$this->error='不支持的水印位置类型'; return false; } } do{ //添加水印 $src = imagecreatetruecolor($info[0], $info[1]); // 调整默认颜色 $color = imagecolorallocate($src, 255, 255, 255); imagefill($src, 0, 0, $color); imagecopy($src, $this->img, 0, 0, $x, $y, $info[0], $info[1]); imagecopy($src, $water, 0, 0, 0, 0, $info[0], $info[1]); imagecopymerge($this->img, $src, $x, $y, 0, 0, $info[0], $info[1], $alpha); //销毁零时图片资源 imagedestroy($src); } while(!empty($this->gif)&&$this->gifnext()); //销毁水印资源 imagedestroy($water); } /** * 图像添加文字 * @param string $text 添加的文字 * @param string $font 字体路径 * @param integer $size 字号 * @param string $color 文字颜色 * @param integer $locate 文字写入位置 * @param integer $offset 文字相对当前位置的偏移量 * @param integer $angle 文字倾斜角度 */ public function text($text, $font, $size, $color = '#00000000', $locate = image::image_water_southeast, $offset = 0, $angle = 0){ //资源检测 if(empty($this->img)){ $this->error='没有可以被写入文字的图像资源'; return false; } if(!is_file($font)){ $this->error="不存在的字体文件:{$font}"; return false; } //获取文字信息 $info = imagettfbbox($size, $angle, $font, $text); $minx = min($info[0], $info[2], $info[4], $info[6]); $maxx = max($info[0], $info[2], $info[4], $info[6]); $miny = min($info[1], $info[3], $info[5], $info[7]); $maxy = max($info[1], $info[3], $info[5], $info[7]); /* 计算文字初始坐标和尺寸 */ $x = $minx; $y = abs($miny); $w = $maxx - $minx; $h = $maxy - $miny; /* 设定文字位置 */ switch ($locate) { /* 右下角文字 */ case image::image_water_southeast: $x += $this->info['width'] - $w; $y += $this->info['height'] - $h; break; /* 左下角文字 */ case image::image_water_southwest: $y += $this->info['height'] - $h; break; /* 左上角文字 */ case image::image_water_northwest: // 起始坐标即为左上角坐标,无需调整 break; /* 右上角文字 */ case image::image_water_northeast: $x += $this->info['width'] - $w; break; /* 居中文字 */ case image::image_water_center: $x += ($this->info['width'] - $w)/2; $y += ($this->info['height'] - $h)/2; break; /* 下居中文字 */ case image::image_water_south: $x += ($this->info['width'] - $w)/2; $y += $this->info['height'] - $h; break; /* 右居中文字 */ case image::image_water_east: $x += $this->info['width'] - $w; $y += ($this->info['height'] - $h)/2; break; /* 上居中文字 */ case image::image_water_north: $x += ($this->info['width'] - $w)/2; break; /* 左居中文字 */ case image::image_water_west: $y += ($this->info['height'] - $h)/2; break; default: /* 自定义文字坐标 */ if(is_array($locate)){ list($posx, $posy) = $locate; $x += $posx; $y += $posy; } else {$this->error='不支持的文字位置类型'; return false; } } /* 设置偏移量 */ if(is_array($offset)){ $offset = array_map('intval', $offset); list($ox, $oy) = $offset; } else{ $offset = intval($offset); $ox = $oy = $offset; } /* 设置颜色 */ if(is_string($color) && 0 === strpos($color, '#')){ $color = str_split(substr($color, 1), 2); $color = array_map('hexdec', $color); if(empty($color[3]) || $color[3] > 127){ $color[3] = 0; } } elseif (!is_array($color)) { $this->error='错误的颜色值'; return false; } do{ /* 写入文字 */ $col = imagecolorallocatealpha($this->img, $color[0], $color[1], $color[2], $color[3]); imagettftext($this->img, $size, $angle, $x + $ox, $y + $oy, $col, $font, $text); } while(!empty($this->gif)&&$this->gifnext()); } /* 切换到gif的下一帧并保存当前帧,内部使用 */ private function gifnext(){ ob_start(); ob_implicit_flush(0); imagegif($this->img); $img = ob_get_clean(); $this->gif->image($img); $next = $this->gif->nextimage(); if($next){ $this->img = imagecreatefromstring($next); return $next; } else { $this->img = imagecreatefromstring($this->gif->image()); return false; } } /** * 析构方法,用于销毁图像资源 */ public function __destruct() { empty($this->img) || imagedestroy($this->img); } } class gif{ /** * gif帧列表 * @var array */ private $frames = array(); /** * 每帧等待时间列表 * @var array */ private $delays = array(); /** * 构造方法,用于解码gif图片 * @param string $src gif图片数据 * @param string $mod 图片数据类型 */ public function __construct($src = null, $mod = 'url') { if(!is_null($src)){ if('url' == $mod && is_file($src)){ $src = file_get_contents($src); } /* 解码gif图片 */ try{ $de = new gifdecoder($src); $this->frames = $de->gifgetframes(); $this->delays = $de->gifgetdelays(); } catch(exception $e){ $this->error='解码gif图片出错'; return false; } } } /** * 设置或获取当前帧的数据 * @param string $stream 二进制数据流 * @return boolean 获取到的数据 */ public function image($stream = null){ if(is_null($stream)){ $current = current($this->frames); return false === $current ? reset($this->frames) : $current; } else { $this->frames[key($this->frames)] = $stream; } } /** * 将当前帧移动到下一帧 * @return string 当前帧数据 */ public function nextimage(){ return next($this->frames); } /** * 编码并保存当前gif图片 * @param string $gifname 图片名称 */ public function save($gifname){ $gif = new gifencoder($this->frames, $this->delays, 0, 2, 0, 0, 0, 'bin'); file_put_contents($gifname, $gif->getanimation()); } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifencoder version 2.0 by lászló zsidi, http://gifs.hu :: :: this class is a rewritten 'gifmerge.class.php' version. :: :: modification: :: - simplified and easy code, :: - ultra fast encoding, :: - built-in errors, :: - stable working :: :: :: updated at 2007. 02. 13. '00.05.am' :: :: :: :: try on-line gifbuilder form demo based on gifencoder. :: :: http://gifs.hu/phpclasses/demos/gifbuilder/ :: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ class gifencoder { private $gif = "gif89a"; /* gif header 6 bytes */ private $ver = "gifencoder v2.05"; /* encoder version */ private $buf = array ( ); private $lop = 0; private $dis = 2; private $col = -1; private $img = -1; private $err = array ( 'err00' => "does not supported function for only one image!", 'err01' => "source is not a gif image!", 'err02' => "unintelligible flag ", 'err03' => "does not make animation from animated gif source", ); /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifencoder... :: */ public function __construct($gif_src, $gif_dly, $gif_lop, $gif_dis,$gif_red, $gif_grn, $gif_blu, $gif_mod) { if ( ! is_array ( $gif_src ) && ! is_array ( $gif_dly ) ) { printf ( "%s: %s", $this->ver, $this->err [ 'err00' ] ); exit ( 0 ); } $this->lop = ( $gif_lop > -1 ) ? $gif_lop : 0; $this->dis = ( $gif_dis > -1 ) ? ( ( $gif_dis < 3 ) ? $gif_dis : 3 ) : 2; $this->col = ( $gif_red > -1 && $gif_grn > -1 && $gif_blu > -1 ) ? ( $gif_red | ( $gif_grn << 8 ) | ( $gif_blu << 16 ) ) : -1; for ( $i = 0; $i < count ( $gif_src ); $i++ ) { if ( strtolower ( $gif_mod ) == "url" ) { $this->buf [ ] = fread ( fopen ( $gif_src [ $i ], "rb" ), filesize ( $gif_src [ $i ] ) ); } else if ( strtolower ( $gif_mod ) == "bin" ) { $this->buf [ ] = $gif_src [ $i ]; } else { printf ( "%s: %s ( %s )!", $this->ver, $this->err [ 'err02' ], $gif_mod ); exit ( 0 ); } if ( substr ( $this->buf [ $i ], 0, 6 ) != "gif87a" && substr ( $this->buf [ $i ], 0, 6 ) != "gif89a" ) { printf ( "%s: %d %s", $this->ver, $i, $this->err [ 'err01' ] ); exit ( 0 ); } for ( $j = ( 13 + 3 * ( 2 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ) ) ), $k = true; $k; $j++ ) { switch ( $this->buf [ $i ] { $j } ) { case "!": if ( ( substr ( $this->buf [ $i ], ( $j + 3 ), 8 ) ) == "netscape" ) { printf ( "%s: %s ( %s source )!", $this->ver, $this->err [ 'err03' ], ( $i + 1 ) ); exit ( 0 ); } break; case ";": $k = false; break; } } } $this->gifaddheader ( ); for ( $i = 0; $i < count ( $this->buf ); $i++ ) { $this->gifaddframes ( $i, $gif_dly [ $i ] ); } $this->gifaddfooter ( ); } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifaddheader... :: */ private function gifaddheader ( ) { $cmap = 0; if ( ord ( $this->buf [ 0 ] { 10 } ) & 0x80 ) { $cmap = 3 * ( 2 << ( ord ( $this->buf [ 0 ] { 10 } ) & 0x07 ) ); $this->gif .= substr ( $this->buf [ 0 ], 6, 7 ); $this->gif .= substr ( $this->buf [ 0 ], 13, $cmap ); $this->gif .= "!\377\13netscape2.0\3\1" . $this->gifword ( $this->lop ) . "\0"; } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifaddframes... :: */ private function gifaddframes ( $i, $d ) { $locals_str = 13 + 3 * ( 2 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ) ); $locals_end = strlen ( $this->buf [ $i ] ) - $locals_str - 1; $locals_tmp = substr ( $this->buf [ $i ], $locals_str, $locals_end ); $global_len = 2 << ( ord ( $this->buf [ 0 ] { 10 } ) & 0x07 ); $locals_len = 2 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ); $global_rgb = substr ( $this->buf [ 0 ], 13, 3 * ( 2 << ( ord ( $this->buf [ 0 ] { 10 } ) & 0x07 ) ) ); $locals_rgb = substr ( $this->buf [ $i ], 13, 3 * ( 2 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ) ) ); $locals_ext = "!\xf9\x04" . chr ( ( $this->dis << 2 ) + 0 ) . chr ( ( $d >> 0 ) & 0xff ) . chr ( ( $d >> 8 ) & 0xff ) . "\x0\x0"; if ( $this->col > -1 && ord ( $this->buf [ $i ] { 10 } ) & 0x80 ) { for ( $j = 0; $j < ( 2 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ) ); $j++ ) { if ( ord ( $locals_rgb { 3 * $j + 0 } ) == ( ( $this->col >> 16 ) & 0xff ) && ord ( $locals_rgb { 3 * $j + 1 } ) == ( ( $this->col >> 8 ) & 0xff ) && ord ( $locals_rgb { 3 * $j + 2 } ) == ( ( $this->col >> 0 ) & 0xff ) ) { $locals_ext = "!\xf9\x04" . chr ( ( $this->dis << 2 ) + 1 ) . chr ( ( $d >> 0 ) & 0xff ) . chr ( ( $d >> 8 ) & 0xff ) . chr ( $j ) . "\x0"; break; } } } switch ( $locals_tmp { 0 } ) { case "!": $locals_img = substr ( $locals_tmp, 8, 10 ); $locals_tmp = substr ( $locals_tmp, 18, strlen ( $locals_tmp ) - 18 ); break; case ",": $locals_img = substr ( $locals_tmp, 0, 10 ); $locals_tmp = substr ( $locals_tmp, 10, strlen ( $locals_tmp ) - 10 ); break; } if ( ord ( $this->buf [ $i ] { 10 } ) & 0x80 && $this->img > -1 ) { if ( $global_len == $locals_len ) { if ( $this->gifblockcompare ( $global_rgb, $locals_rgb, $global_len ) ) { $this->gif .= ( $locals_ext . $locals_img . $locals_tmp ); } else { $byte = ord ( $locals_img { 9 } ); $byte |= 0x80; $byte &= 0xf8; $byte |= ( ord ( $this->buf [ 0 ] { 10 } ) & 0x07 ); $locals_img { 9 } = chr ( $byte ); $this->gif .= ( $locals_ext . $locals_img . $locals_rgb . $locals_tmp ); } } else { $byte = ord ( $locals_img { 9 } ); $byte |= 0x80; $byte &= 0xf8; $byte |= ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ); $locals_img { 9 } = chr ( $byte ); $this->gif .= ( $locals_ext . $locals_img . $locals_rgb . $locals_tmp ); } } else { $this->gif .= ( $locals_ext . $locals_img . $locals_tmp ); } $this->img = 1; } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifaddfooter... :: */ private function gifaddfooter ( ) { $this->gif .= ";"; } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifblockcompare... :: */ private function gifblockcompare ( $globalblock, $localblock, $len ) { for ( $i = 0; $i < $len; $i++ ) { if ( $globalblock { 3 * $i + 0 } != $localblock { 3 * $i + 0 } || $globalblock { 3 * $i + 1 } != $localblock { 3 * $i + 1 } || $globalblock { 3 * $i + 2 } != $localblock { 3 * $i + 2 } ) { return ( 0 ); } } return ( 1 ); } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifword... :: */ private function gifword ( $int ) { return ( chr ( $int & 0xff ) . chr ( ( $int >> 8 ) & 0xff ) ); } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: getanimation... :: */ public function getanimation ( ) { return ( $this->gif ); } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifdecoder version 2.0 by lászló zsidi, http://gifs.hu :: :: created at 2007. 02. 01. '07.47.am' :: :: :: :: :: try on-line gifbuilder form demo based on gifdecoder. :: :: http://gifs.hu/phpclasses/demos/gifbuilder/ :: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ class gifdecoder { private $gif_buffer = array ( ); private $gif_arrays = array ( ); private $gif_delays = array ( ); private $gif_stream = ""; private $gif_string = ""; private $gif_bfseek = 0; private $gif_screen = array ( ); private $gif_global = array ( ); private $gif_sorted; private $gif_colors; private $gif_colorc; private $gif_colorf; /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifdecoder ( $gif_pointer ) :: */ public function __construct ( $gif_pointer ) { $this->gif_stream = $gif_pointer; $this->gifgetbyte ( 6 ); // gif89a $this->gifgetbyte ( 7 ); // logical screen descriptor $this->gif_screen = $this->gif_buffer; $this->gif_colorf = $this->gif_buffer [ 4 ] & 0x80 ? 1 : 0; $this->gif_sorted = $this->gif_buffer [ 4 ] & 0x08 ? 1 : 0; $this->gif_colorc = $this->gif_buffer [ 4 ] & 0x07; $this->gif_colors = 2 << $this->gif_colorc; if ( $this->gif_colorf == 1 ) { $this->gifgetbyte ( 3 * $this->gif_colors ); $this->gif_global = $this->gif_buffer; } /* * * 05.06.2007. * made a little modification * * - for ( $cycle = 1; $cycle; ) { + if ( gifdecoder::gifgetbyte ( 1 ) ) { - switch ( $this->gif_buffer [ 0 ] ) { - case 0x21: - gifdecoder::gifreadextensions ( ); - break; - case 0x2c: - gifdecoder::gifreaddescriptor ( ); - break; - case 0x3b: - $cycle = 0; - break; - } - } + else { + $cycle = 0; + } - } */ for ( $cycle = 1; $cycle; ) { if ( $this->gifgetbyte ( 1 ) ) { switch ( $this->gif_buffer [ 0 ] ) { case 0x21: $this->gifreadextensions ( ); break; case 0x2c: $this->gifreaddescriptor ( ); break; case 0x3b: $cycle = 0; break; } } else { $cycle = 0; } } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifreadextension ( ) :: */ private function gifreadextensions ( ) { $this->gifgetbyte ( 1 ); for ( ; ; ) { $this->gifgetbyte ( 1 ); if ( ( $u = $this->gif_buffer [ 0 ] ) == 0x00 ) { break; } $this->gifgetbyte ( $u ); /* * 07.05.2007. * implemented a new line for a new function * to determine the originaly delays between * frames. * */ if ( $u == 4 ) { $this->gif_delays [ ] = ( $this->gif_buffer [ 1 ] | $this->gif_buffer [ 2 ] << 8 ); } } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifreadextension ( ) :: */ private function gifreaddescriptor ( ) { $gif_screen = array ( ); $this->gifgetbyte ( 9 ); $gif_screen = $this->gif_buffer; $gif_colorf = $this->gif_buffer [ 8 ] & 0x80 ? 1 : 0; if ( $gif_colorf ) { $gif_code = $this->gif_buffer [ 8 ] & 0x07; $gif_sort = $this->gif_buffer [ 8 ] & 0x20 ? 1 : 0; } else { $gif_code = $this->gif_colorc; $gif_sort = $this->gif_sorted; } $gif_size = 2 << $gif_code; $this->gif_screen [ 4 ] &= 0x70; $this->gif_screen [ 4 ] |= 0x80; $this->gif_screen [ 4 ] |= $gif_code; if ( $gif_sort ) { $this->gif_screen [ 4 ] |= 0x08; } $this->gif_string = "gif87a"; $this->gifputbyte ( $this->gif_screen ); if ( $gif_colorf == 1 ) { $this->gifgetbyte ( 3 * $gif_size ); $this->gifputbyte ( $this->gif_buffer ); } else { $this->gifputbyte ( $this->gif_global ); } $this->gif_string .= chr ( 0x2c ); $gif_screen [ 8 ] &= 0x40; $this->gifputbyte ( $gif_screen ); $this->gifgetbyte ( 1 ); $this->gifputbyte ( $this->gif_buffer ); for ( ; ; ) { $this->gifgetbyte ( 1 ); $this->gifputbyte ( $this->gif_buffer ); if ( ( $u = $this->gif_buffer [ 0 ] ) == 0x00 ) { break; } $this->gifgetbyte ( $u ); $this->gifputbyte ( $this->gif_buffer ); } $this->gif_string .= chr ( 0x3b ); /* add frames into $gif_stream array... */ $this->gif_arrays [ ] = $this->gif_string; } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifgetbyte ( $len ) :: */ /* * * 05.06.2007. * made a little modification * * - function gifgetbyte ( $len ) { - $this->gif_buffer = array ( ); - - for ( $i = 0; $i < $len; $i++ ) { + if ( $this->gif_bfseek > strlen ( $this->gif_stream ) ) { + return 0; + } - $this->gif_buffer [ ] = ord ( $this->gif_stream { $this->gif_bfseek++ } ); - } + return 1; - } */ private function gifgetbyte ( $len ) { $this->gif_buffer = array ( ); for ( $i = 0; $i < $len; $i++ ) { if ( $this->gif_bfseek > strlen ( $this->gif_stream ) ) { return 0; } $this->gif_buffer [ ] = ord ( $this->gif_stream { $this->gif_bfseek++ } ); } return 1; } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifputbyte ( $bytes ) :: */ private function gifputbyte ( $bytes ) { for ( $i = 0; $i < count ( $bytes ); $i++ ) { $this->gif_string .= chr ( $bytes [ $i ] ); } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: public functions :: :: :: gifgetframes ( ) :: */ public function gifgetframes ( ) { return ( $this->gif_arrays ); } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: gifgetdelays ( ) :: */ public function gifgetdelays ( ) { return ( $this->gif_delays ); } }
3. [文件] imagick.class.php
<?php namespace ybl; class imagick{ /** * 图像资源对象 * @var resource */ private $img; /** * 图像信息,包括width,height,type,mime,size * @var array */ private $info; private $gif_proess; public $error; /** * 构造方法,可用于打开一张图像 * @param string $imgname 图像路径 */ public function __construct($gif_proess=true) { $this->gif_proess=$gif_proess; } /** * 打开一张图像 * @param string $imgname 图像路径 */ public function open($imgname){ //检测图像文件 if(!is_file($imgname)){ $this->error='不存在的图像文件'; return false; } //销毁已存在的图像 empty($this->img) || $this->img->destroy(); //载入图像 $this->img = new imagick(realpath($imgname)); //设置图像信息 $this->info = array( 'width' => $this->img->getimagewidth(), 'height' => $this->img->getimageheight(), 'type' => strtolower($this->img->getimageformat()), 'mime' => $this->img->getimagemimetype(), ); } /** * 保存图像 * @param string $imgname 图像保存名称 * @param string $type 图像类型 * @param integer $quality jpeg图像质量 * @param boolean $interlace 是否对jpeg类型图像设置隔行扫描 */ public function save($imgname, $type = null, $quality=80,$interlace = true){ if(empty($this->img)){ $this->error='没有可以被保存的图像资源'; return false; } //设置图片类型 if(is_null($type)){ $type = $this->info['type']; } else { $type = strtolower($type); $this->img->setimageformat($type); } //jpeg图像设置隔行扫描 if('jpeg' == $type || 'jpg' == $type){ $this->img->setimageinterlacescheme(1); } // 设置图像质量 $this->img->setimagecompressionquality($quality); //去除图像配置信息 $this->img->stripimage(); //保存图像 $imgname = realpath(dirname($imgname)) . '/' . basename($imgname); //强制绝对路径 if (('gif' == $type)&&$this->gif_proess) { $this->img->writeimages($imgname, true); } else { $this->img->writeimage($imgname); } } /** * 返回图像宽度 * @return integer 图像宽度 */ public function width(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return $this->info['width']; } /** * 返回图像高度 * @return integer 图像高度 */ public function height(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return $this->info['height']; } /** * 返回图像类型 * @return string 图像类型 */ public function type(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return $this->info['type']; } /** * 返回图像mime类型 * @return string 图像mime类型 */ public function mime(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return $this->info['mime']; } /** * 返回图像尺寸数组 0 - 图像宽度,1 - 图像高度 * @return array 图像尺寸 */ public function size(){ if(empty($this->img)){ $this->error='没有指定图像资源'; return false; } return array($this->info['width'], $this->info['height']); } /** * 裁剪图像 * @param integer $w 裁剪区域宽度 * @param integer $h 裁剪区域高度 * @param integer $x 裁剪区域x坐标 * @param integer $y 裁剪区域y坐标 * @param integer $width 图像保存宽度 * @param integer $height 图像保存高度 */ public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null){ if(empty($this->img)){ $this->error='没有可以被裁剪的图像资源'; return false; } //设置保存尺寸 empty($width) && $width = $w; empty($height) && $height = $h; //裁剪图片 if(('gif' == $this->info['type'])&&$this->gif_proess){ $img = $this->img->coalesceimages(); $this->img->destroy(); //销毁原图 //循环裁剪每一帧 do { $this->_crop($w, $h, $x, $y, $width, $height, $img); } while ($img->nextimage()); //压缩图片 $this->img = $img->deconstructimages(); $img->destroy(); //销毁零时图片 } else { $this->_crop($w, $h, $x, $y, $width, $height); } } /* 裁剪图片,内部调用 */ private function _crop($w, $h, $x, $y, $width, $height, $img = null){ is_null($img) && $img = $this->img; //裁剪 $info = $this->info; if($x != 0 || $y != 0 || $w != $info['width'] || $h != $info['height']){ $img->cropimage($w, $h, $x, $y); $img->setimagepage($w, $h, 0, 0); //调整画布和图片一致 } //调整大小 if($w != $width || $h != $height){ $img->sampleimage($width, $height); } //设置缓存尺寸 $this->info['width'] = $w; $this->info['height'] = $h; } /** * 生成缩略图 * @param integer $width 缩略图最大宽度 * @param integer $height 缩略图最大高度 * @param integer $type 缩略图裁剪类型 */ public function thumb($width, $height, $type = image::image_thumb_scale){ if(empty($this->img)){ $this->error='没有可以被缩略的图像资源'; return false; } //原图宽度和高度 $w = $this->info['width']; $h = $this->info['height']; /* 计算缩略图生成的必要参数 */ switch ($type) { /* 等比例缩放 */ case image::image_thumb_scale: //原图尺寸小于缩略图尺寸则不进行缩略 if($w < $width && $h < $height) return; //计算缩放比例 $scale = min($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $x = $y = 0; $width = $w * $scale; $height = $h * $scale; break; /* 居中裁剪 */ case image::image_thumb_center: //计算缩放比例 $scale = max($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $w = $width/$scale; $h = $height/$scale; $x = ($this->info['width'] - $w)/2; $y = ($this->info['height'] - $h)/2; break; /* 左上角裁剪 */ case image::image_thumb_northwest: //计算缩放比例 $scale = max($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $x = $y = 0; $w = $width/$scale; $h = $height/$scale; break; /* 右下角裁剪 */ case image::image_thumb_southeast: //计算缩放比例 $scale = max($width/$w, $height/$h); //设置缩略图的坐标及宽度和高度 $w = $width/$scale; $h = $height/$scale; $x = $this->info['width'] - $w; $y = $this->info['height'] - $h; break; /* 填充 */ case image::image_thumb_filled: //计算缩放比例 if($w < $width && $h < $height){ $scale = 1; } else { $scale = min($width/$w, $height/$h); } //设置缩略图的坐标及宽度和高度 $neww = $w * $scale; $newh = $h * $scale; $posx = ($width - $w * $scale)/2; $posy = ($height - $h * $scale)/2; //创建一张新图像 $newimg = new imagick(); $newimg->newimage($width, $height, 'white', $this->info['type']); if(('gif' == $this->info['type'])$this->gif_proess){ $imgs = $this->img->coalesceimages(); $img = new imagick(); $this->img->destroy(); //销毁原图 //循环填充每一帧 do { //填充图像 $image = $this->_fill($newimg, $posx, $posy, $neww, $newh, $imgs); $img->addimage($image); $img->setimagedelay($imgs->getimagedelay()); $img->setimagepage($width, $height, 0, 0); $image->destroy(); //销毁零时图片 } while ($imgs->nextimage()); //压缩图片 $this->img->destroy(); $this->img = $img->deconstructimages(); $imgs->destroy(); //销毁零时图片 $img->destroy(); //销毁零时图片 } else { //填充图像 $img = $this->_fill($newimg, $posx, $posy, $neww, $newh); //销毁原图 $this->img->destroy(); $this->img = $img; } //设置新图像属性 $this->info['width'] = $width; $this->info['height'] = $height; return; /* 固定 */ case image::image_thumb_fixed: $x = $y = 0; break; default:$this->error='不支持的缩略图裁剪类型'; return false; } /* 裁剪图像 */ $this->crop($w, $h, $x, $y, $width, $height); } /* 填充指定图像,内部使用 */ private function _fill($newimg, $posx, $posy, $neww, $newh, $img = null){ is_null($img) && $img = $this->img; /* 将指定图片绘入空白图片 */ $draw = new \imagickdraw(); $draw->composite($img->getimagecompose(), $posx, $posy, $neww, $newh, $img); $image = $newimg->clone(); $image->drawimage($draw); $draw->destroy(); return $image; } /** * 添加水印 * @param string $source 水印图片路径 * @param integer $locate 水印位置 * @param integer $alpha 水印透明度 */ public function water($source, $locate = image::image_water_southeast,$alpha=80){ //资源检测 if(empty($this->img)){$this->error='没有可以被添加水印的图像资源'; return false;} if(!is_file($source)){ $this->error='水印图像不存在'; return false; } //创建水印图像资源 $water = new imagick(realpath($source)); $info = array($water->getimagewidth(), $water->getimageheight()); /* 设定水印位置 */ switch ($locate) { /* 右下角水印 */ case image::image_water_southeast: $x = $this->info['width'] - $info[0]; $y = $this->info['height'] - $info[1]; break; /* 左下角水印 */ case image::image_water_southwest: $x = 0; $y = $this->info['height'] - $info[1]; break; /* 左上角水印 */ case image::image_water_northwest: $x = $y = 0; break; /* 右上角水印 */ case image::image_water_northeast: $x = $this->info['width'] - $info[0]; $y = 0; break; /* 居中水印 */ case image::image_water_center: $x = ($this->info['width'] - $info[0])/2; $y = ($this->info['height'] - $info[1])/2; break; /* 下居中水印 */ case image::image_water_south: $x = ($this->info['width'] - $info[0])/2; $y = $this->info['height'] - $info[1]; break; /* 右居中水印 */ case image::image_water_east: $x = $this->info['width'] - $info[0]; $y = ($this->info['height'] - $info[1])/2; break; /* 上居中水印 */ case image::image_water_north: $x = ($this->info['width'] - $info[0])/2; $y = 0; break; /* 左居中水印 */ case image::image_water_west: $x = 0; $y = ($this->info['height'] - $info[1])/2; break; default: /* 自定义水印坐标 */ if(is_array($locate)){ list($x, $y) = $locate; } else { $this->error='不支持的水印位置类型'; return false; } } //创建绘图资源 $draw = new \imagickdraw(); $draw->composite($water->getimagecompose(), $x, $y, $info[0], $info[1], $water); if(('gif' == $this->info['type'])&&$this->gif_proess){ $img = $this->img->coalesceimages(); $this->img->destroy(); //销毁原图 do{ //添加水印 $img->drawimage($draw); } while ($img->nextimage()); //压缩图片 $this->img = $img->deconstructimages(); $img->destroy(); //销毁零时图片 } else { //添加水印 $this->img->drawimage($draw); } //销毁水印资源 $draw->destroy(); $water->destroy(); } /** * 图像添加文字 * @param string $text 添加的文字 * @param string $font 字体路径 * @param integer $size 字号 * @param string $color 文字颜色 * @param integer $locate 文字写入位置 * @param integer $offset 文字相对当前位置的偏移量 * @param integer $angle 文字倾斜角度 */ public function text($text, $font, $size, $color = '#00000000', $locate = image::image_water_southeast, $offset = 0, $angle = 0){ //资源检测 if(empty($this->img)){$this->error='没有可以被写入文字的图像资源'; return false;} if(!is_file($font)){ $this->error="不存在的字体文件:{$font}"; return false; } //获取颜色和透明度 if(is_array($color)){ $color = array_map('dechex', $color); foreach ($color as &$value) { $value = str_pad($value, 2, '0', str_pad_left); } $color = '#' . implode('', $color); } elseif(!is_string($color) || 0 !== strpos($color, '#')) { $this->error='错误的颜色值'; return false; } $col = substr($color, 0, 7); $alp = strlen($color) == 9 ? substr($color, -2) : 0; //获取文字信息 $draw = new \imagickdraw(); $draw->setfont(realpath($font)); $draw->setfontsize($size); $draw->setfillcolor($col); $draw->setfillalpha(1-hexdec($alp)/127); $draw->settextantialias(true); $draw->setstrokeantialias(true); $metrics = $this->img->queryfontmetrics($draw, $text); /* 计算文字初始坐标和尺寸 */ $x = 0; $y = $metrics['ascender']; $w = $metrics['textwidth']; $h = $metrics['textheight']; /* 设定文字位置 */ switch ($locate) { /* 右下角文字 */ case image::image_water_southeast: $x += $this->info['width'] - $w; $y += $this->info['height'] - $h; break; /* 左下角文字 */ case image::image_water_southwest: $y += $this->info['height'] - $h; break; /* 左上角文字 */ case image::image_water_northwest: // 起始坐标即为左上角坐标,无需调整 break; /* 右上角文字 */ case image::image_water_northeast: $x += $this->info['width'] - $w; break; /* 居中文字 */ case image::image_water_center: $x += ($this->info['width'] - $w)/2; $y += ($this->info['height'] - $h)/2; break; /* 下居中文字 */ case image::image_water_south: $x += ($this->info['width'] - $w)/2; $y += $this->info['height'] - $h; break; /* 右居中文字 */ case image::image_water_east: $x += $this->info['width'] - $w; $y += ($this->info['height'] - $h)/2; break; /* 上居中文字 */ case image::image_water_north: $x += ($this->info['width'] - $w)/2; break; /* 左居中文字 */ case image::image_water_west: $y += ($this->info['height'] - $h)/2; break; default: /* 自定义文字坐标 */ if(is_array($locate)){ list($posx, $posy) = $locate; $x += $posx; $y += $posy; } else { $this->error='不支持的文字位置类型'; return false; } } /* 设置偏移量 */ if(is_array($offset)){ $offset = array_map('intval', $offset); list($ox, $oy) = $offset; } else{ $offset = intval($offset); $ox = $oy = $offset; } /* 写入文字 */ if(('gif' == $this->info['type'])&&$this->gif_proess){ $img = $this->img->coalesceimages(); $this->img->destroy(); //销毁原图 do{ $img->annotateimage($draw, $x + $ox, $y + $oy, $angle, $text); } while ($img->nextimage()); //压缩图片 $this->img = $img->deconstructimages(); $img->destroy(); //销毁零时图片 } else { $this->img->annotateimage($draw, $x + $ox, $y + $oy, $angle, $text); } $draw->destroy(); } /** * 析构方法,用于销毁图像资源 */ public function __destruct() { empty($this->img) || $this->img->destroy(); } }
4. [文件] image.php <?php namespace ybl; set_time_limit(0); require_once('../lib/image/image.class.php'); $source='image/ybl.gif'; $image=new image(1); //======================================================================== //打开一幅图像 $image->open($source); echo '图片宽度:'.$image->width(),'<br/>'; echo '图片高度:'.$image->height(),'<br/>'; echo '图片类型:'.$image->type(),'<br/>'; echo '图像mime类型:'.$image->mime(),'<br/>'; $size=$image->size(); echo '图片宽度:'.$size[0],'<br/>'; echo '图片高度:'.$size[1],'<br/>'; $savename='image/save.gif'; //保存图片 //参数 图片保存地址,图片类型,图像质量,是否对jpeg类型图片设置隔行扫描 $image->save($savename); $wh=2; //====================================================================== //生成缩略图 //参数 缩略图最大宽度,缩略图最大高度,缩略图裁剪类型 $image->thumb($size[0]*$wh,$size[1]*$wh,5); $savename='image/thumb.gif'; $image->save($savename); //================================================================================= //图像添加文字 $text='你好!!!文字'; //字体类型 $fonturl='image/simhei.ttf'; //字体大小 $fontsize='20'; //字体颜色 $fontcolor='#fff'; //字体倾斜度 $fontxdu=20; //参数 添加的文字,字体路径,字号,文字颜色,文字写入位置,文字相对当前位置的偏移量,文字倾斜角度 $image->text($text,$fonturl,$fontsize,$fontcolor,array(100,100),0,$fontxdu); $savename='image/text.gif'; $image->save($savename); //================================================================================= //打水印 $alpha=80; $water='image/water.png'; //数组表示 水印位置 //数字 水印位置类型 $xy=array(120,20); //参数 水印图片路径,水印位置,水印透明度 $image->water($water,$xy,$alpha); $savename='image/water_aim.gif'; $image->save($savename); //================================================================================= //裁剪图像 //参数 裁剪区域宽度,裁剪区域高度,裁剪区域x坐标,裁剪区域y坐标,图片保存宽度,图片保存高度 $image->crop(100,100,100,100); $savename='image/crop.gif'; $image->save($savename);
其它类似信息

推荐信息