当前位置:首页 > PHP教程 > php类库 > 列表

php实现的通用图片处理类

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-18 09:23:29 浏览: 评论:0 

这篇文章主要介绍了php实现的通用图片处理类,可实现针对图片的缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色等功能,具有一定参考借鉴价值,需要的朋友可以参考下。

本文实例讲述了php实现的通用图片处理类,分享给大家供大家参考,具体如下:

该图片处理函数功能:缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色,处理并保存历史记录的思路:当有图片有改动时自动生成一张新图片,命名方式可以考虑在原图片的基础上加上步骤,例如:图片名称+__第几步。 在一些需要图片高级处理功能的Web应用中,可以参考这个类。

  1. <?php 
  2. class picture 
  3.   var $PICTURE_URL;//要处理的图片 
  4.   var $DEST_URL="temp__01.jpg";//生成目标图片位置 
  5.   var $PICTURE_CREATE;//要创建的图片 
  6.   var $TURE_COLOR;//新建一个真彩图象 
  7.   var $PICTURE_WIDTH;//原图片宽度 
  8.   var $PICTURE_HEIGHT;//原图片高度 
  9. /* 
  10. 水印的类型,默认的为水印文字 
  11. */ 
  12.   var $MARK_TYPE=1; 
  13.   var $WORD;//经过UTF-8后的文字 
  14.   var $WORD_X;//文字横坐标 
  15.   var $WORD_Y;//文字纵坐标 
  16.   var $FONT_TYPE;//字体类型 
  17.   var $FONT_SIZE="12";//字体大小 
  18.   var $FONT_WORD;//文字 
  19.   var $ANGLE=0;//文字的角度,默认为0 
  20.   var $FONT_COLOR="#000000";//文字颜色 
  21.   var $FONT_PATH="font/simkai.ttf";//字体库,默认为宋体 
  22.   var $FORCE_URL;//水印图片 
  23.   var $FORCE_X=0;//水印横坐标 
  24.   var $FORCE_Y=0;//水印纵坐标 
  25.   var $FORCE_START_X=0;//切起水印的图片横坐标 
  26.   var $FORCE_START_Y=0;//切起水印的图片纵坐标 
  27.   var $PICTURE_TYPE;//图片类型 
  28.   var $PICTURE_MIME;//输出的头部 
  29. /* 
  30. 缩放比例为1的话就按缩放高度和宽度缩放 
  31. */ 
  32.   var $ZOOM=1;//缩放类型 
  33.   var $ZOOM_MULTIPLE;//缩放比例 
  34.   var $ZOOM_WIDTH;//缩放宽度 
  35.   var $ZOOM_HEIGHT;//缩放高度 
  36. /* 
  37. 裁切,按比例和固定长度、宽度 
  38. */ 
  39.   var $CUT_TYPE=1;//裁切类型 
  40.   var $CUT_X=0;//裁切的横坐标 
  41.   var $CUT_Y=0;//裁切的纵坐标 
  42.   var $CUT_;//裁切的宽度 
  43.   var $CUT_HEIGHT=100;//裁切的高度 
  44. /* 
  45. 锐化 
  46. */ 
  47.   var $SHARP="7.0";//锐化程度 
  48. /* 
  49. 透明度处理 
  50. */ 
  51.   var $ALPHA='100';//透明度在0-127之间 
  52.   var $ALPHA_X="90"
  53.   var $ALPHA_Y="50"
  54. /* 
  55. 任意角度旋转 
  56. */ 
  57.   var $CIRCUMROTATE="90.0";//注意,必须为浮点数 
  58. /* 
  59. 出错信息 
  60. */ 
  61.   var $ERROR=array
  62.     'unalviable'=>'没有找到相关图片!' 
  63.   ); 
  64. /* 
  65. 构造函数:函数初始化 
  66. */ 
  67.   function __construct($PICTURE_URL
  68.   { 
  69.     $this->get_info($PICTURE_URL); 
  70.   } 
  71.   function get_info($PICTURE_URL
  72.   { 
  73.     /* 
  74.     处理原图片的信息,先检测图片是否存在,不存在则给出相应的信息 
  75.     */ 
  76.     @$SIZE=getimagesize($PICTURE_URL); 
  77.     if(!$SIZE
  78.     { 
  79.       exit($this->ERROR['unalviable']); 
  80.     } 
  81.     //得到原图片的信息类型、宽度、高度 
  82.     $this->PICTURE_MIME=$SIZE['mime']; 
  83.     $this->PICTURE_; 
  84.     $this->PICTURE_HEIGHT=$SIZE[1]; 
  85.     //创建图片 
  86.     switch($SIZE[2]) 
  87.     { 
  88.       case 1: 
  89.         $this->PICTURE_CREATE=imagecreatefromgif($PICTURE_URL); 
  90.         $this->PICTURE_TYPE="imagejpeg"
  91.         $this->PICTURE_EXT="jpg"
  92.         break
  93.       case 2: 
  94.         $this->PICTURE_CREATE=imagecreatefromjpeg($PICTURE_URL); 
  95.         $this->PICTURE_TYPE="imagegif"
  96.         $this->PICTURE_EXT="gif"
  97.         break
  98.       case 3: 
  99.         $this->PICTURE_CREATE=imagecreatefrompng($PICTURE_URL); 
  100.         $this->PICTURE_TYPE="imagepng"
  101.         $this->PICTURE_EXT="png"
  102.         break
  103.     }  
  104.     /* 
  105.     文字颜色转换16进制转换成10进制 
  106.     */ 
  107.     preg_match_all("/([0-f]){2,2}/i",$this->FONT_COLOR,$MATCHES); 
  108.     if(count($MATCHES)==3) 
  109.     { 
  110.       $this->RED=hexdec($MATCHES[0][0]); 
  111.       $this->GREEN=hexdec($MATCHES[0][1]); 
  112.       $this->BLUE=hexdec($MATCHES[0][2]); 
  113.     } 
  114.   } 
  115.   //end of __construct 
  116.   /* 
  117.   将16进制的颜色转换成10进制的(R,G,B) 
  118.   */ 
  119.   function hex2dec() 
  120.   { 
  121.     preg_match_all("/([0-f]){2,2}/i",$this->FONT_COLOR,$MATCHES); 
  122.     if(count($MATCHES)==3) 
  123.     { 
  124.       $this->RED=hexdec($MATCHES[0][0]); 
  125.       $this->GREEN=hexdec($MATCHES[0][1]); 
  126.       $this->BLUE=hexdec($MATCHES[0][2]); 
  127.     } 
  128.   } 
  129.   //缩放类型 
  130.   function zoom_type($ZOOM_TYPE
  131.   { 
  132.     $this->ZOOM=$ZOOM_TYPE
  133.   } 
  134.   //对图片进行缩放,如果不指定高度和宽度就进行缩放 
  135.   function zoom() 
  136.   { 
  137.     //缩放的大小 
  138.     if($this->ZOOM==0) 
  139.     { 
  140.       $this->ZOOM_;gt;PICTURE_WIDTH * $this->ZOOM_MULTIPLE; 
  141.       $this->ZOOM_HEIGHT=$this->PICTURE_HEIGHT * $this->ZOOM_MULTIPLE; 
  142.     } 
  143.     //新建一个真彩图象 
  144.     $this->TRUE_COLOR=imagecreatetruecolor($this->ZOOM_WIDTH,$this->ZOOM_HEIGHT); 
  145.     $WHITE=imagecolorallocate($this->TRUE_COLOR,255,255,255); 
  146.     imagefilledrectangle($this->TRUE_COLOR,0,0,$this->ZOOM_WIDTH,$this->ZOOM_HEIGHT,$WHITE); 
  147.     imagecopyresized($this->TRUE_COLOR,$this->PICTURE_CREATE,0,0,0,0,$this->ZOOM_WIDTH,$this->ZOOM_HEIGHT,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  148.   } 
  149.   //end of zoom 
  150.   //裁切图片,按坐标或自动 
  151.   function cut() 
  152.   { 
  153.     $this->TRUE_COLOR=imagecreatetruecolor($this->CUT_WIDTH,$this->CUT_WIDTH); 
  154.     imagecopy($this->TRUE_COLOR,$this->PICTURE_CREATE, 0, 0, $this->CUT_X, $this->CUT_Y,$this->CUT_WIDTH,$this->CUT_HEIGHT); 
  155.   } 
  156.   //end of cut 
  157.   /* 
  158.   在图片上放文字或图片 
  159.   水印文字 
  160.   */ 
  161.   function _mark_text() 
  162.   { 
  163.     $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  164.     $this->WORD=mb_convert_encoding($this->FONT_WORD,'utf-8','gb2312'); 
  165.     /* 
  166.     取得使用 TrueType 字体的文本的范围 
  167.     */ 
  168.     $TEMP = imagettfbbox($this->FONT_SIZE,0,$this->FONT_PATH,$this->WORD); 
  169.     $WORD_LENGTH=strlen($this->WORD); 
  170.     $WORD_WIDTH =$TEMP[2] - $TEMP[6]; 
  171.     $WORD_HEIGHT =$TEMP[3] - $TEMP[7]; 
  172.     /* 
  173.     文字水印的默认位置为右下角 
  174.     */ 
  175.     if($this->WORD_X==""
  176.     { 
  177.       $this->WORD_X=$this->PICTURE_WIDTH-$WORD_WIDTH
  178.     } 
  179.     if($this->WORD_Y==""
  180.     { 
  181.       $this->WORD_Y=$this->PICTURE_HEIGHT-$WORD_HEIGHT
  182.     } 
  183.     imagesettile($this->TRUE_COLOR,$this->PICTURE_CREATE); 
  184.     imagefilledrectangle($this->TRUE_COLOR,0,0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT,IMG_COLOR_TILED); 
  185.     $TEXT2=imagecolorallocate($this->TRUE_COLOR,$this->RED,$this->GREEN,$this->Blue); 
  186.     imagettftext($this->TRUE_COLOR,$this->FONT_SIZE,$this->ANGLE,$this->WORD_X,$this->WORD_Y,$TEXT2,$this->FONT_PATH,$this->WORD); 
  187.   } 
  188.   /* 
  189.   水印图片 
  190.   */ 
  191. function _mark_picture() 
  192.   /* 
  193.   获取水印图片的信息 
  194.   */ 
  195.   @$SIZE=getimagesize($this->FORCE_URL); 
  196.   if(!$SIZE
  197.   { 
  198.     exit($this->ERROR['unalviable']); 
  199.   } 
  200.   $FORCE_PICTURE_
  201.   $FORCE_PICTURE_HEIGHT=$SIZE[1]; 
  202.   //创建水印图片 
  203.   switch($SIZE[2]) 
  204.   { 
  205.     case 1: 
  206.       $FORCE_PICTURE_CREATE=imagecreatefromgif($this->FORCE_URL); 
  207.       $FORCE_PICTURE_TYPE="gif"
  208.       break
  209.     case 2: 
  210.       $FORCE_PICTURE_CREATE=imagecreatefromjpeg($this->FORCE_URL); 
  211.       $FORCE_PICTURE_TYPE="jpg"
  212.       break
  213.     case 3: 
  214.       $FORCE_PICTURE_CREATE=imagecreatefrompng($this->FORCE_URL); 
  215.       $FORCE_PICTURE_TYPE="png"
  216.       break
  217.   } 
  218. /* 
  219.   判断水印图片的大小,并生成目标图片的大小,如果水印比图片大,则生成图片大小为水印图片的大小。否则生成的图片大小为原图片大小。 
  220. */ 
  221.   $this->NEW_PICTURE=$this->PICTURE_CREATE; 
  222.   if($FORCE_PICTURE_WIDTH>$this->PICTURE_WIDTH) 
  223.   { 
  224.     $CREATE_;gt;FORCE_START_X; 
  225.   } 
  226.   else 
  227.   { 
  228.     $CREATE_;gt;PICTURE_WIDTH; 
  229.   } 
  230.   if($FORCE_PICTURE_HEIGHT>$this->PICTURE_HEIGHT) 
  231.   { 
  232.     $CREATE_HEIGHT=$FORCE_PICTURE_HEIGHT-$this->FORCE_START_Y; 
  233.   } 
  234.   else 
  235.   { 
  236.     $CREATE_HEIGHT=$this->PICTURE_HEIGHT; 
  237.   } 
  238.   /* 
  239.   创建一个画布 
  240.   */ 
  241.   $NEW_PICTURE_CREATE=imagecreatetruecolor($CREATE_WIDTH,$CREATE_HEIGHT); 
  242.   $WHITE=imagecolorallocate($NEW_PICTURE_CREATE,255,255,255); 
  243.   /* 
  244.   将背景图拷贝到画布中 
  245.   */ 
  246.   imagecopy($NEW_PICTURE_CREATE$this->PICTURE_CREATE, 0, 0, 0, 0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  247.   /* 
  248.   将目标图片拷贝到背景图片上 
  249.   */ 
  250.   imagecopy($NEW_PICTURE_CREATE$FORCE_PICTURE_CREATE$this->FORCE_X, $this->FORCE_Y, $this->FORCE_START_X, $this->FORCE_START_Y,$FORCE_PICTURE_WIDTH,$FORCE_PICTURE_HEIGHT); 
  251.   $this->TRUE_COLOR=$NEW_PICTURE_CREATE
  252. //end of mark 
  253. function alpha_() 
  254.   $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  255.   $rgb="#CDCDCD"
  256.   $tran_color="#000000"
  257.   for($j=0;$j<=$this->PICTURE_HEIGHT-1;$j++) 
  258.   { 
  259.     for ($i=0;$i<=$this->PICTURE_WIDTH-1;$i++) 
  260.     { 
  261.       $rgb = imagecolorat($this->PICTURE_CREATE,$i,$j); 
  262.       $r = ($rgb >> 16) & 0xFF; 
  263.       $g = ($rgb >> 8) & 0xFF; 
  264.       $b = $rgb & 0xFF; 
  265.       $now_color=imagecolorallocate($this->PICTURE_CREATE,$r,$g,$b); 
  266.       if ($now_color==$tran_color
  267.       { 
  268.         continue
  269.       } 
  270.       else 
  271.       { 
  272.         $color=imagecolorallocatealpha($this->PICTURE_CREATE,$r,$g,$b,$ALPHA); 
  273.         imagesetpixel($this->PICTURE_CREATE,$ALPHA_X+$i,$ALPHA_Y+$j,$color); 
  274.       } 
  275.       $this->TRUE_COLOR=$this->PICTURE_CREATE; 
  276.     } 
  277.   } 
  278. /* 
  279. 图片旋转: 
  280. 沿y轴旋转 
  281. */ 
  282. function turn_y() 
  283.   $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  284.   for ($x = 0; $x < $this->PICTURE_WIDTH; $x++) 
  285.   { 
  286.     imagecopy($this->TRUE_COLOR, $this->PICTURE_CREATE, $this->PICTURE_WIDTH - $x - 1, 0, $x, 0, 1, $this->PICTURE_HEIGHT); 
  287.   } 
  288. /* 
  289. 沿X轴旋转 
  290. */ 
  291. function turn_x() 
  292.   $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  293.   for ($y = 0; $y < $this->PICTURE_HEIGHT; $y++) 
  294.   { 
  295.     imagecopy($this->TRUE_COLOR, $this->PICTURE_CREATE, 0, $this->PICTURE_HEIGHT - $y - 1, 0, $y$this->PICTURE_WIDTH, 1); 
  296.   } 
  297. /* 
  298. 任意角度旋转 
  299. */ 
  300. function turn() 
  301.   $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  302.   imageCopyResized($this->TRUE_COLOR,$this->PICTURE_CREATE,0,0,0,0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  303.   $WHITE=imagecolorallocate($this->TRUE_COLOR,255,255,255); 
  304.   $this->TRUE_COLOR=imagerotate ($this->TRUE_COLOR, $this->CIRCUMROTATE, $WHITE); 
  305. /* 
  306. 图片锐化 
  307. */ 
  308. function sharp() 
  309.   $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  310.   $cnt=0; 
  311.   for ($x=0; $x<$this->PICTURE_WIDTH; $x++) 
  312.   { 
  313.     for ($y=0; $y<$this->PICTURE_HEIGHT; $y++) 
  314.     { 
  315.       $src_clr1 = imagecolorsforindex($this->TRUE_COLOR, imagecolorat($this->PICTURE_CREATE, $x-1, $y-1)); 
  316.       $src_clr2 = imagecolorsforindex($this->TRUE_COLOR, imagecolorat($this->PICTURE_CREATE, $x$y)); 
  317.       $r = intval($src_clr2["red"]+$this->SHARP*($src_clr2["red"]-$src_clr1["red"])); 
  318.       $g = intval($src_clr2["green"]+$this->SHARP*($src_clr2["green"]-$src_clr1["green"])); 
  319.       $b = intval($src_clr2["blue"]+$this->SHARP*($src_clr2["blue"]-$src_clr1["blue"])); 
  320.       $r = min(255, max($r, 0)); 
  321.       $g = min(255, max($g, 0)); 
  322.       $b = min(255, max($b, 0)); 
  323.       if (($DST_CLR=imagecolorexact($this->PICTURE_CREATE, $r$g$b))==-1) 
  324.         $DST_CLR = imagecolorallocate($this->PICTURE_CREATE, $r$g$b); 
  325.         $cnt++; 
  326.       if ($DST_CLR==-1) die("color allocate faile at $x, $y ($cnt)."); 
  327.         imagesetpixel($this->TRUE_COLOR, $x$y$DST_CLR); 
  328.     } 
  329.   } 
  330. /* 
  331.   将图片反色处理?? 
  332. */ 
  333. function return_color() 
  334.   /* 
  335.   创建一个画布 
  336.   */ 
  337.   $NEW_PICTURE_CREATE=imagecreate($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  338.   $WHITE=imagecolorallocate($NEW_PICTURE_CREATE,255,255,255); 
  339.   /* 
  340.   将背景图拷贝到画布中 
  341.   */ 
  342.   imagecopy($NEW_PICTURE_CREATE$this->PICTURE_CREATE, 0, 0, 0, 0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  343.   $this->TRUE_COLOR=$NEW_PICTURE_CREATE
  344. /* 
  345. 生成目标图片并显示 
  346. */ 
  347. function show() 
  348.   // 判断浏览器,若是IE就不发送头 
  349.   if(isset($_SERVER['HTTP_USER_AGENT'])) 
  350.   { 
  351.     $ua = strtoupper($_SERVER['HTTP_USER_AGENT']); 
  352.     if(!preg_match('/^.*MSIE.*\)$/i',$ua)) 
  353.     { 
  354.       header("Content-type:$this->PICTURE_MIME"); 
  355.     } 
  356.   } 
  357.   $OUT=$this->PICTURE_TYPE; 
  358.   $OUT($this->TRUE_COLOR); 
  359. /* 
  360. 生成目标图片并保存 
  361. */ 
  362. function save_picture() 
  363.   // 以 JPEG 格式将图像输出到浏览器或文件 
  364.   $OUT=$this->PICTURE_TYPE; 
  365.   if(function_exists($OUT)) 
  366.   { 
  367.     // 判断浏览器,若是IE就不发送头 
  368.     if(isset($_SERVER['HTTP_USER_AGENT'])) 
  369.     { 
  370.       $ua = strtoupper($_SERVER['HTTP_USER_AGENT']); 
  371.       if(!preg_match('/^.*MSIE.*\)$/i',$ua)) 
  372.       { 
  373.         header("Content-type:$this->PICTURE_MIME"); 
  374.       } 
  375.     } 
  376.     if(!$this->TRUE_COLOR) 
  377.     { 
  378.       exit($this->ERROR['unavilable']); 
  379.     } 
  380.     else 
  381.     { 
  382.       $OUT($this->TRUE_COLOR,$this->DEST_URL); 
  383.       $OUT($this->TRUE_COLOR); 
  384.     } 
  385.   } 
  386. /* 
  387. 析构函数:释放图片 
  388. */ 
  389. function __destruct() 
  390. /*释放图片*/ 
  391.   imagedestroy($this->TRUE_COLOR); 
  392.   imagedestroy($this->PICTURE_CREATE); 
  393. //end of class 
  394. ?>

Tags: php图片处理类

分享到:

相关文章