PHP 处理图片的类实现代码

复制代码 代码如下:

  <?php

  /**

  * author:yagas

  * email:[email protected]

  */

  class Image

  {

  /** 类保护变量 */

  protected $th_width = 100;

  protected $th_height = 50;

  protected $quality = 85; //图片质量

  protected $transparent = 50; //水印透明度

  protected $background = "255,255,255"; //背景颜色

  /**

  * 生成缩略图文件

  * @param $src 原图文件

  * @param $dst 目标文件

  */

  public function thumb($src, $dst=null, $output=true)

  {

  $thumb = array($this->th_width, $this->th_height);

  $this->scale($src, $thumb, $dst, $output);

  }

  /**

  * 对图片按百分比进行缩放处理

  * @param string $src 原图文件

  * @param string $dst 输入的目标文件

  * @param float/array $zoom 缩放比例,浮点类型时按百分比绽放,数组类型时按指定大小时行缩放

  * @param boolean $output 是否生成文件输出

  */

  public function scale($src, $dst=null, $zoom=1, $output=true)

  {

  if(!file_exists($src)) die('File not exists.');

  if(!$zoom) die('the zoom undefine.');

  $src_im = $this->IM($src);

  $old_width = imagesx($src_im);

  if(is_float($zoom)) {

  //按百分比进行缩放

  $new_width = $old_width * $zoom;

  }

  elseif(is_array($zoom)) {

  //明确的缩放尺寸

  $new_width = $zoom[0];

  }

  //是否定义的缩放的高度

  if(!isset($zoom[1])) {

  //等比例缩放

  $resize_im = $this->imageresize($src_im, $new_width);

  }

  else {

  //非等比例缩放

  $resize_im = $this->imageresize($src_im, $new_width, $zoom[1]);

  }

  if(!$output) {

  header("Content-type: image/jpeg");

  imagejpeg($resize_im, null, $this->quality);

  }

  else {

  $new_file = empty($dst)? $src:$dst;

  imagejpeg($resize_im, $new_file, $this->quality);

  }

  imagedestroy($im);

  imagedestroy($nIm);

  }

  /**

  * 对图片进行裁切

  * @param $src 原始文件

  * @param $dst 目标文件

  * @param $output 是否生成目标文件

  */

  public function capture($src, $dst=null, $output=true) {

  if(!file_exists($src)) die('File not exists.');

  $width = $this->th_width;

  $height = $this->th_height;

  $src_im = $this->IM($src);

  $old_width = imagesx($src_im);

  $old_height = imagesy($src_im);

  $capture = imagecreatetruecolor($width, $height);

  $rgb = explode(",", $this->background);

  $white = imagecolorallocate($capture, $rgb[0], $rgb[1], $rgb[2]);

  imagefill($capture, 0, 0, $white);

  //当图片大于缩略图时进行缩放

  if($old_width > $width && $old_height>$height) {

  $resize_im = $this->imageresize($src_im, $width);

  //图片比例不合规范时,重新计算比例进行裁切

  if(imagesy($resize_im) < $height) {

  $proportion = $old_height/$this->th_height;

  $resize_im = $this->imageresize($src_im, $old_width/$proportion);

  }

  $posx = 0;

  $posy = 0;

  }

  else {

  //图片小于缩略图时将图片居中显示

  $posx = ($width-$old_width)/2;

  $posy = ($height-$old_height)/2;

  $resize_im = $src_im;

  }

  imagecopy($capture, $resize_im, $posx, $posy, 0, 0, imagesx($resize_im), imagesy($resize_im));

  if(!$output) {

  header("Content-type: image/jpeg");

  imagejpeg($capture, null, $this->quality);

  }

  else {

  $new_file = empty($dst)? $src:$dst;

  imagejpeg($capture, $new_file, $this->quality);

  }

  imagedestroy($src_im);

  @imagedestroy($resize_im);

  imagedestroy($capture);

  }

  /**

  * 写入水印图片

  * @param $src 需要写入水印的图片

  * @param $mark 水印图片

  * @param $transparent 水印透明度

  */

  public function mark($src, $mark, $dst='', $output=true)

  {

  $mark_info = getimagesize($mark);

  $src_info = getimagesize($src);

  list($mw,$mh) = $mark_info;

  list($sw,$sh) = $src_info;

  $px = $sw - $mw;

  $py = $sh - $mh;

  $im = $this->IM($src);

  $mim = $this->IM($mark);

  imagecopymerge($im, $mim, $px, $py, 0, 0, $mw, $mh, $this->transparent);

  if($output){

  $new_file = empty($dst)? $src:$dst;

  imagejpeg($im, $new_file, $this->quality);

  }

  else

  {

  header('Content-type: image/jpeg');

  imagejpeg($im);

  }

  imagedestroy($im);

  imagedestroy($mim);

  }

  /**

  * 通过文件,获取不同的GD对象

  */

  protected function IM($file)

  {

  if(!file_exists($file)) die('File not exists.');

  $info = getimagesize($file);

  switch($info['mime'])

  {

  case 'image/gif':

  $mim = imagecreatefromgif($file);

  break;

  case 'image/png':

  $mim = imagecreatefrompng($file);

  imagealphablending($mim, false);

  imagesavealpha($mim, true);

  break;

  case 'image/jpeg':

  $mim = imagecreatefromjpeg($file);

  break;

  default:

  die('File format errors.');

  }

  return $mim;

  }

  /**

  * 对图片进行缩放的处理

  * @param resource $src_im 图像GD对象

  * @param integer $width 图片的宽度

  * @param integer $height 图片的高度,如果不设置高度,将对图片进行等比例缩放

  * @return resuorce $im 返回一个GD对象

  */

  protected function imageresize($src_im, $width, $height=null) {

  $old_width = imagesx($src_im);

  $old_height = imagesy($src_im);

  $proportion = $old_width/$old_height;

  $new_width = $width;

  $new_height = is_null($height)? round($new_width / $proportion):$height;

  //创建新的图象并填充默认的背景色

  $im = imagecreatetruecolor($new_width, $new_height);

  $rgb = explode(",", $this->background);

  $white = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]);

  imagefill($im, 0, 0, $white);

  //对图片进行缩放

  imagecopyresized($im, $src_im, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);

  return $im;

  }

  /**

  * 类变量赋值

  */

  public function __set($key, $value)

  {

  $this->$key = $value;

  }

  /**

  * 获取类变量值

  */

  public function __get($key)

  {

  return $this->$key;

  }

  }

  ?>