VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • 一个经典实用的PHP图像处理类分享

这篇文章主要介绍了一个经典实用的PHP图像处理类分享,本文提供的PHP图像操作类可以满足网站中的大部分功能需求,如图片的缩放、加水印和裁剪等功能,需要的朋友可以参考下

本图像处理类可以完成对图片的缩放、加水印和裁剪的功能,支持多种图片类型的处理,缩放时进行优化等。

  1. <?php 
  2. /** 
  3.  file: image.class.php 类名为Image 
  4.  图像处理类,可以完成对各种类型的图像进行缩放、加图片水印和剪裁的操作。 
  5.  */ 
  6. class Image { 
  7.   /* 图片保存的路径 */ 
  8.   private $path
  9.    
  10.   /** 
  11.    * 实例图像对象时传递图像的一个路径,默认值是当前目录 
  12.    * @param  string $path  可以指定处理图片的路径 
  13.    */ 
  14.   function __construct($path="./"){ 
  15.     $this->path = rtrim($path,"/")."/"
  16.   } 
  17.    
  18.   /** 
  19.    * 对指定的图像进行缩放 
  20.    * @param  string $name  是需要处理的图片名称 
  21.    * @param  int $width   缩放后的宽度 
  22.    * @param  int $height   缩放后的高度 
  23.    * @param  string $qz   是新图片的前缀 
  24.    * @return mixed      是缩放后的图片名称,失败返回false; 
  25.    */ 
  26.   function thumb($name$width$height,$qz="th_"){ 
  27.     /* 获取图片宽度、高度、及类型信息 */ 
  28.     $imgInfo = $this->getInfo($name); 
  29.     /* 获取背景图片的资源 */ 
  30.     $srcImg = $this->getImg($name$imgInfo); 
  31.     /* 获取新图片尺寸 */ 
  32.     $size = $this->getNewSize($name,$width$height,$imgInfo); 
  33.     /* 获取新的图片资源 */ 
  34.     $newImg = $this->kidOfImage($srcImg$size,$imgInfo); 
  35.     /* 通过本类的私有方法,保存缩略图并返回新缩略图的名称,以"th_"为前缀 */ 
  36.     return $this->createNewImage($newImg$qz.$name,$imgInfo); 
  37.   } 
  38.    
  39.   /** 
  40.    * 为图片添加水印 
  41.    * @param  string $groundName 背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式 
  42.    * @param  string $waterName 图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式 
  43.    * @param  int $waterPos    水印位置,有10种状态,0为随机位置; 
  44.    *                1为顶端居左,2为顶端居中,3为顶端居右; 
  45.    *                4为中部居左,5为中部居中,6为中部居右; 
  46.    *                7为底端居左,8为底端居中,9为底端居右; 
  47.    * @param  string $qz     加水印后的图片的文件名在原文件名前面加上这个前缀 
  48.    * @return  mixed        是生成水印后的图片名称,失败返回false 
  49.    */ 
  50.   function waterMark($groundName$waterName$waterPos=0, $qz="wa_"){ 
  51.     /*获取水印图片是当前路径,还是指定了路径*/ 
  52.     $curpath = rtrim($this->path,"/")."/"
  53.     $dir = dirname($waterName); 
  54.     if($dir == "."){ 
  55.       $wpath = $curpath
  56.     }else
  57.       $wpath = $dir."/"
  58.       $waterName = basename($waterName); 
  59.     } 
  60.    
  61.     /*水印图片和背景图片必须都要存在*/ 
  62.     if(file_exists($curpath.$groundName) && file_exists($wpath.$waterName)){ 
  63.       $groundInfo = $this->getInfo($groundName);        //获取背景信息 
  64.       $waterInfo = $this->getInfo($waterName$dir);      //获取水印图片信息 
  65.       /*如果背景比水印图片还小,就会被水印全部盖住*/ 
  66.       if(!$pos = $this->position($groundInfo$waterInfo$waterPos)){ 
  67.         echo '水印不应该比背景图片小!'
  68.         return false; 
  69.       } 
  70.    
  71.       $groundImg = $this->getImg($groundName$groundInfo);  //获取背景图像资源 
  72.       $waterImg = $this->getImg($waterName$waterInfo$dir); //获取水印图片资源 
  73.    
  74.       /* 调用私有方法将水印图像按指定位置复制到背景图片中 */ 
  75.       $groundImg = $this->copyImage($groundImg$waterImg$pos$waterInfo); 
  76.       /* 通过本类的私有方法,保存加水图片并返回新图片的名称,默认以"wa_"为前缀 */ 
  77.       return $this->createNewImage($groundImg$qz.$groundName$groundInfo); 
  78.    
  79.     }else
  80.       echo '图片或水印图片不存在!'
  81.       return false; 
  82.     } 
  83.   } 
  84.    
  85.   /** 
  86.    * 在一个大的背景图片中剪裁出指定区域的图片 
  87.    * @param  string $name  需要剪切的背景图片 
  88.    * @param  int $x     剪切图片左边开始的位置 
  89.    * @param  int $y     剪切图片顶部开始的位置 
  90.    * @param  int $width   图片剪裁的宽度 
  91.    * @param  int $height   图片剪裁的高度 
  92.    * @param  string $qz   新图片的名称前缀 
  93.    * @return  mixed      裁剪后的图片名称,失败返回false; 
  94.    */ 
  95.   function cut($name$x$y$width$height$qz="cu_"){ 
  96.     $imgInfo=$this->getInfo($name);         //获取图片信息 
  97.     /* 裁剪的位置不能超出背景图片范围 */ 
  98.     if( (($x+$width) > $imgInfo['width']) || (($y+$height) > $imgInfo['height'])){ 
  99.       echo "裁剪的位置超出了背景图片范围!"
  100.       return false; 
  101.     } 
  102.    
  103.     $back = $this->getImg($name$imgInfo);     //获取图片资源 
  104.     /* 创建一个可以保存裁剪后图片的资源 */ 
  105.     $cutimg = imagecreatetruecolor($width$height); 
  106.     /* 使用imagecopyresampled()函数对图片进行裁剪 */ 
  107.     imagecopyresampled($cutimg$back, 0, 0, $x$y$width$height$width$height); 
  108.     imagedestroy($back); 
  109.     /* 通过本类的私有方法,保存剪切图并返回新图片的名称,默认以"cu_"为前缀 */ 
  110.     return $this->createNewImage($cutimg$qz.$name,$imgInfo); 
  111.   } 
  112.    
  113.   /* 内部使用的私有方法,用来确定水印图片的位置 */ 
  114.   private function position($groundInfo$waterInfo$waterPos){ 
  115.     /* 需要加水印的图片的长度或宽度比水印还小,无法生成水印 */ 
  116.     if( ($groundInfo["width"]<$waterInfo["width"]) || ($groundInfo["height"]<$waterInfo["height"]) ) { 
  117.       return false; 
  118.     } 
  119.     switch($waterPos) { 
  120.       case 1:     //1为顶端居左 
  121.         $posX = 0; 
  122.         $posY = 0; 
  123.         break
  124.       case 2:     //2为顶端居中 
  125.         $posX = ($groundInfo["width"] - $waterInfo["width"]) / 2; 
  126.         $posY = 0; 
  127.         break
  128.       case 3:     //3为顶端居右 
  129.         $posX = $groundInfo["width"] - $waterInfo["width"]; 
  130.         $posY = 0; 
  131.         break
  132.       case 4:     //4为中部居左 
  133.         $posX = 0; 
  134.         $posY = ($groundInfo["height"] - $waterInfo["height"]) / 2; 
  135.         break
  136.       case 5:     //5为中部居中 
  137.         $posX = ($groundInfo["width"] - $waterInfo["width"]) / 2; 
  138.         $posY = ($groundInfo["height"] - $waterInfo["height"]) / 2; 
  139.         break
  140.       case 6:     //6为中部居右 
  141.         $posX = $groundInfo["width"] - $waterInfo["width"]; 
  142.         $posY = ($groundInfo["height"] - $waterInfo["height"]) / 2; 
  143.         break
  144.       case 7:     //7为底端居左 
  145.         $posX = 0; 
  146.         $posY = $groundInfo["height"] - $waterInfo["height"]; 
  147.         break
  148.       case 8:     //8为底端居中 
  149.         $posX = ($groundInfo["width"] - $waterInfo["width"]) / 2; 
  150.         $posY = $groundInfo["height"] - $waterInfo["height"]; 
  151.         break
  152.       case 9:     //9为底端居右 
  153.         $posX = $groundInfo["width"] - $waterInfo["width"]; 
  154.         $posY = $groundInfo["height"] - $waterInfo["height"]; 
  155.         break
  156.       case 0: 
  157.       default:    //随机 
  158.         $posX = rand(0,($groundInfo["width"] - $waterInfo["width"])); 
  159.         $posY = rand(0,($groundInfo["height"] - $waterInfo["height"])); 
  160.         break
  161.     } 
  162.     return array("posX"=>$posX"posY"=>$posY); 
  163.   } 
  164.    
  165.   /* 内部使用的私有方法,用于获取图片的属性信息(宽度、高度和类型) */ 
  166.   private function getInfo($name$path=".") { 
  167.     $spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/'
  168.    
  169.     $data = getimagesize($spath.$name); 
  170.     $imgInfo["width"]  = $data[0]; 
  171.     $imgInfo["height"] = $data[1]; 
  172.     $imgInfo["type"]  = $data[2]; 
  173.    
  174.     return $imgInfo
  175.   } 
  176.    
  177.   /*内部使用的私有方法, 用于创建支持各种图片格式(jpg,gif,png三种)资源 */ 
  178.   private function getImg($name$imgInfo$path='.'){ 
  179.    
  180.     $spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/'
  181.     $srcPic = $spath.$name
  182.    
  183.     switch ($imgInfo["type"]) { 
  184.       case 1:         //gif 
  185.         $img = imagecreatefromgif($srcPic); 
  186.         break
  187.       case 2:         //jpg 
  188.         $img = imagecreatefromjpeg($srcPic); 
  189.         break
  190.       case 3:         //png 
  191.         $img = imagecreatefrompng($srcPic); 
  192.         break
  193.       default
  194.         return false; 
  195.         break
  196.     } 
  197.     return $img
  198.   } 
  199.    
  200.   /* 内部使用的私有方法,返回等比例缩放的图片宽度和高度,如果原图比缩放后的还小保持不变 */ 
  201.   private function getNewSize($name$width$height$imgInfo){ 
  202.     $size["width"] = $imgInfo["width"];     //原图片的宽度 
  203.     $size["height"] = $imgInfo["height"];    //原图片的高度 
  204.    
  205.     if($width < $imgInfo["width"]){ 
  206.       $size["width"]=$width;          //缩放的宽度如果比原图小才重新设置宽度 
  207.     } 
  208.    
  209.     if($height < $imgInfo["height"]){ 
  210.       $size["height"] = $height;        //缩放的高度如果比原图小才重新设置高度 
  211.     } 
  212.     /* 等比例缩放的算法 */ 
  213.     if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]){ 
  214.       $size["height"] = round($imgInfo["height"]*$size["width"]/$imgInfo["width"]); 
  215.     }else
  216.       $size["width"] = round($imgInfo["width"]*$size["height"]/$imgInfo["height"]); 
  217.     } 
  218.    
  219.     return $size
  220.   } 
  221.    
  222.   /* 内部使用的私有方法,用于保存图像,并保留原有图片格式 */ 
  223.   private function createNewImage($newImg$newName$imgInfo){ 
  224.     $this->path = rtrim($this->path,"/")."/"
  225.     switch ($imgInfo["type"]) { 
  226.       case 1:       //gif 
  227.         $result = imageGIF($newImg$this->path.$newName); 
  228.         break
  229.       case 2:       //jpg 
  230.         $result = imageJPEG($newImg,$this->path.$newName); 
  231.         break
  232.       case 3:       //png 
  233.         $result = imagePng($newImg$this->path.$newName); 
  234.         break
  235.     } 
  236.     imagedestroy($newImg); 
  237.     return $newName
  238.   } 
  239.    
  240.   /* 内部使用的私有方法,用于加水印时复制图像 */ 
  241.   private function copyImage($groundImg$waterImg$pos$waterInfo){ 
  242.     imagecopy($groundImg$waterImg$pos["posX"], $pos["posY"], 0, 0, $waterInfo["width"],$waterInfo["height"]); 
  243.     imagedestroy($waterImg); 
  244.     return $groundImg
  245.   } 
  246.    
  247.   /* 内部使用的私有方法,处理带有透明度的图片保持原样 */ 
  248.   private function kidOfImage($srcImg$size$imgInfo){ 
  249.     $newImg = imagecreatetruecolor($size["width"], $size["height"]); 
  250.     $otsc = imagecolortransparent($srcImg); 
  251.     if$otsc >= 0 && $otsc < imagecolorstotal($srcImg)) { 
  252.       $transparentcolor = imagecolorsforindex( $srcImg$otsc ); 
  253.       $newtransparentcolor = imagecolorallocate( 
  254.       $newImg
  255.       $transparentcolor['red'], 
  256.       $transparentcolor['green'], 
  257.       $transparentcolor['blue'
  258.       ); 
  259.       imagefill( $newImg, 0, 0, $newtransparentcolor ); 
  260.       imagecolortransparent( $newImg$newtransparentcolor ); 
  261.     } 
  262.     imagecopyresized( $newImg$srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] ); 
  263.     imagedestroy($srcImg); 
  264.     return $newImg
  265.   } 

原文链接:http://www.phpfensi.com/php/20210426/14569.html


相关教程