一个经典实用的PHP图像处理类分享

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

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

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