当前位置:首页 > PHP教程 > php图像处理 > 列表

PHP添加图片水印、压缩、剪切的封装类

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-16 11:50:30 浏览: 评论:0 

为了防止自己辛苦制作的作品被别人窃取,经常给作品添加水印,以此保证作品的唯一性,那么该怎么给图片添加水印呢,如果作品尺寸过大,该如何处理呢,下面小编给大家详细介绍有关PHP给图片添加水印 压缩 剪切的封装类,需要的朋友可以参考下

给图片添加水印,其实就是把原来的图片和水印添加在一起,下面小编把最近整理的资料分享给大家。

php对图片文件的操作主要是利用GD库扩展。当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码。当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有了封装成类的想法。

操作图片主要历经四个步骤:

第一步:打开图片

第二步:操作图片

第三步:输出图片

第四步:销毁图片

1,3,4三个步骤每次都要写,每次又都差不多。真正需要变通的只有操作图片的这一步骤了。操作图片又往往通过1或多个主要的GD函数来完成。

本文封装类里面的四种方法,文字水印(imagettftext()),图片水印(imagecopymerge()),图片压缩,图片剪切(imagecopyresampled()),其余的常用GD函数便不赘述。

直接上代码:

  1. <?php  
  2. class Image 
  3. {  
  4.  private $info
  5.  private $image
  6.  public $type
  7.  public function __construct($src
  8.  { 
  9.   $this->info=getimagesize($src); 
  10.   $this->type=image_type_to_extension($this->info['2'],false); 
  11.   $fun="imagecreatefrom{$this->type}"
  12.   $this->image=$fun($src); 
  13.  } 
  14.  /** 
  15.   * 文字水印 
  16.   * @param [type] $font  字体 
  17.   * @param [type] $content 内容 
  18.   * @param [type] $size  文字大小 
  19.   * @param [type] $col  文字颜色(四元数组) 
  20.   * @param array $location 位置  
  21.   * @param integer $angle 倾斜角度 
  22.   * @return [type]    
  23.   */ 
  24.  public function fontMark($font,$content,$size,$col,$location,$angle=0){ 
  25.   $col=imagecolorallocatealpha($this->image, $col['0'], $col['1'], $col['2'],$col['3']); 
  26.   imagettftext($this->image, $size$angle$location['0'], $location['1'], $col,$font,$content); 
  27.  } 
  28.  /** 
  29.   * 图片水印 
  30.   * @param [type] $imageMark 水印图片地址 
  31.   * @param [type] $dst  水印图片在原图片中的位置 
  32.   * @param [type] $pct  透明度 
  33.   * @return [type]    
  34.   */ 
  35.  public function imageMark($imageMark,$dst,$pct){ 
  36.   $info2=getimagesize($imageMark); 
  37.   $type=image_type_to_extension($info2['2'],false); 
  38.   $func2="imagecreatefrom".$type
  39.   $water=$func2($imageMark); 
  40.   imagecopymerge($this->image, $water$dst[0], $dst[1], 0, 0, $info2['0'], $info2['1'], $pct); 
  41.   imagedestroy($water); 
  42.  } 
  43.  /** 
  44.   * 压缩图片 
  45.   * @param [type] $thumbSize 压缩图片大小 
  46.   * @return [type]   [description] 
  47.   */ 
  48.  public function thumb($thumbSize){ 
  49.   $imageThumb=imagecreatetruecolor($thumbSize[0], $thumbSize[1]); 
  50.   imagecopyresampled($imageThumb$this->image, 0, 0, 0, 0, $thumbSize[0], $thumbSize[1], $this->info['0'], $this->info['1']); 
  51.   imagedestroy($this->image); 
  52.   $this->image=$imageThumb
  53.  } 
  54.  /** 
  55.  * 裁剪图片 
  56.   * @param [type] $cutSize 裁剪大小 
  57.   * @param [type] $location 裁剪位置 
  58.   * @return [type]   [description] 
  59.   */ 
  60.   public function cut($cutSize,$location){ 
  61.    $imageCut=imagecreatetruecolor($cutSize[0],$cutSize[1]); 
  62.    imagecopyresampled($imageCut$this->image, 0, 0, $location[0], $location[1],$cutSize[0],$cutSize[1],$cutSize[0],$cutSize[1]); 
  63.    imagedestroy($this->image); 
  64.    $this->image=$imageCut
  65.   } 
  66.  /** 
  67.   * 展现图片 
  68.   * @return [type] [description] 
  69.   */ 
  70.  public function show(){ 
  71.   header("content-type:".$this->info['mime']); 
  72.   $funn="image".$this->type; 
  73.   $funn($this->image); 
  74.  } 
  75.  /** 
  76.   * 保存图片 
  77.  * @param [type] $newname 新图片名 
  78.  * @return [type]   [description] 
  79.  */ 
  80.   public function save($newname){ 
  81.    header("content-type:".$this->info['mime']); 
  82.    $funn="image".$this->type; 
  83.    $funn($this->image,$newname.'.'.$this->type); 
  84.   } 
  85.   public function __destruct(){ 
  86.    imagedestroy($this->image); 
  87.   } 
  88.  } 
  89.  ?> 

如果还需要其他操作,只需要再往这个类里面添加就好啦~~

给图片添加水印代码:

先看文件check_image_addwatermark.php代码

  1. <?php  
  2. //修改图片效果 
  3. $db = mysql_connect('localhost','root','Ctrip07185419'or die('can not connect to database'); 
  4. mysql_select_db('moviesite',$dbor die(mysql_error($db)); 
  5. //上传文件的路径 
  6. $dir = 'D:\Serious\phpdev\test\images'
  7. //设置环境变量 
  8. putenv('GDFONTPATH='.'C:\Windows\Fonts'); 
  9. $font = "arial"
  10. //upload_image.php页面传递过来的参数,如果是上传图片 
  11. if($_POST['submit'] == 'Upload'
  12.  if($_FILES['uploadfile']['error'] != UPLOAD_ERR_OK) 
  13.  { 
  14.   switch($_FILES['uploadfile']['error']) 
  15.   { 
  16.    case UPLOAD_ERR_INI_SIZE: 
  17.     die('The uploaded file exceeds the upload_max_filesize directive'); 
  18.    break
  19.    case UPLOAD_ERR_FORM_SIZE: 
  20.     die('The upload file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'); 
  21.    break
  22.    case UPLOAD_ERR_PARTIAL: 
  23.     die('The uploaded file was only partially uploaded'); 
  24.    break
  25.    case UPLOAD_ERR_NO_FILE: 
  26.     die('No file was uploaded'); 
  27.    break
  28.    case UPLOAD_ERR_NO_TMP_DIR: 
  29.     die('The server is missing a temporary folder'); 
  30.    break;  
  31.    case UPLOAD_ERR_CANT_WRITE: 
  32.     die('The server fail to write the uploaded file to the disk'); 
  33.    break;   
  34.    case UPLOAD_ERR_EXTENSION: 
  35.     die('The upload stopped by extension'); 
  36.    break;     
  37.   } 
  38.  } 
  39.  $image_caption = $_POST['caption']; 
  40.  $image_username = $_POST['username']; 
  41.  $image_date = date('Y-m-d'); 
  42.  list($width,$height,$type,$attr) = getimagesize($_FILES['uploadfile']['tmp_name']); 
  43.  $error = 'The file you upload is not a supported filetype'
  44.  switch($type
  45.  { 
  46.   case IMAGETYPE_GIF: 
  47.    $image = imagecreatefromgif($_FILES['uploadfile']['tmp_name']) or die($error); 
  48.   break
  49.   case IMAGETYPE_JPEG: 
  50.    $image = imagecreatefromjpeg($_FILES['uploadfile']['tmp_name']) or die($error); 
  51.   break
  52.   case IMAGETYPE_PNG: 
  53.    $image = imagecreatefrompng($_FILES['uploadfile']['tmp_name']) or die($error); 
  54.   break
  55.   default
  56.   break
  57.  } 
  58.  $query = 'insert into images(image_caption,image_username,image_date) values("'.$image_caption.'" , "'.$image_username.'","'.$image_date.'")'
  59.  $result = mysql_query($query,$dbor die(mysql_error($db)); 
  60.  $last_id = mysql_insert_id(); 
  61.  // $imagename = $last_id.'.jpg'; 
  62.  // imagejpeg($image,$dir.'/'.$imagename); 
  63.  // imagedestroy($image); 
  64.  $image_id = $last_id
  65.  imagejpeg($image , $dir.'/'.$image_id.'.jpg'); 
  66.  imagedestroy($image); 
  67. else //如果图片已经上传,则从数据库中取图片名字 
  68.  $query = 'select image_id,image_caption,image_username,image_date from images where image_id='.$_POST['id']; 
  69.  $result = mysql_query($query,$dbor die(mysql_error($db)); 
  70.  extract(mysql_fetch_assoc($result)); 
  71.  list($width,$height,$type,$attr) = getimagesize($dir.'/'.$image_id.'.jpg'); 
  72. //如果是保存图片 
  73. if($_POST['submit'] == 'Save'
  74.  if(isset($_POST['id']) && ctype_digit($_POST['id']) && file_exists($dir.'/'.$_POST['id'].'.jpg')) 
  75.  { 
  76.   $image = imagecreatefromjpeg($dir.'/'.$_POST['id'].'.jpg'); 
  77.  } 
  78.  else 
  79.  { 
  80.   die('invalid image specified'); 
  81.  } 
  82.  $effect = (isset($_POST['effect'])) ? $_POST['effect'] : -1; 
  83.  switch($effect
  84.  { 
  85.   case IMG_FILTER_NEGATE: 
  86.    imagefilter($image , IMG_FILTER_NEGATE);  //将图像中所有颜色反转 
  87.   break
  88.   case IMG_FILTER_GRAYSCALE: 
  89.    imagefilter($image , IMG_FILTER_GRAYSCALE); //将图像转换为灰度的 
  90.   break
  91.   case IMG_FILTER_EMBOSS: 
  92.    imagefilter($image , IMG_FILTER_EMBOSS);  //使图像浮雕化 
  93.   break
  94.   case IMG_FILTER_GAUSSIAN_BLUR: 
  95.    imagefilter($image , IMG_FILTER_GAUSSIAN_BLUR); //用高斯算法模糊图像 
  96.   break;  
  97.  } 
  98.  if(isset($_POST['emb_caption'])) 
  99.  { 
  100.   imagettftext($image , 12 , 0 , 20 , 20 , 0 , $font , $image_caption); 
  101.  } 
  102.  if(isset($_POST['emb_logo'])) 
  103.  { 
  104.   //获取水印图片的尺寸并创建水印 
  105.   list($wmk_width , $wmk_height) = getimagesize('images/logo.png'); 
  106.   $x = ($width-$wmk_width) / 2; 
  107.   $y = ($height-$wmk_height)/2; 
  108.   $wmk = imagecreatefrompng('images/logo.png'); 
  109.   //把水印图片和原图片合并在一起 
  110.   imagecopymerge($image , $wmk , $x , $y , 0 , 0 , $wmk_width , $wmk_height , 20); 
  111.   //清除水印图片 
  112.   imagedestroy($wmk); 
  113.  } 
  114.  imagejpeg($image , $dir.'/'.$_POST['id'].'.jpg' , 100); 
  115.  ?> 
  116.  <html> 
  117.   <head> 
  118.    <title>Here is your pic!</title> 
  119.   </head> 
  120.   <body> 
  121.    <h1>Your image has been saved!</h1> 
  122.    <img src="images/<?php echo $_POST['id'];?>.jpg" alt="" /> 
  123.   </body> 
  124.  </html> 
  125. <?php  
  126. else 
  127. ?> 
  128.  <html> 
  129.   <head> 
  130.    <title>Here is your pic!</title> 
  131.   </head> 
  132.   <body> 
  133.    <h1>So how does it feel to be famous?</h1> 
  134.    <p>Here is the picture you just uploaded to your servers:</p> 
  135.    <!--<img src="images/<?php echo $imagename;?>" alt="" style="float:left;" />--> 
  136.   </body> 
  137.  </html> 
  138.  <?php 
  139.   if($_POST['submit'] == 'Upload'
  140.   { 
  141.    $imagename = 'images/'.$image_id.'.jpg'
  142.   } 
  143.   else 
  144.   { 
  145.    $imagename = 'image_effect.php?id='.$image_id.'&e='.$_POST['effect']; 
  146.    if(isset($_POST['emb_caption'])) 
  147.    { 
  148.     $imagename .= '&capt='.urlencode($image_caption); 
  149.    } 
  150.    if(isset($_POST['emb_logo'])) 
  151.    { 
  152.     $imagename .= '&logo=1'
  153.    } 
  154.   } 
  155.  ?> 
  156.  <img src="<?php echo $imagename;?>" style="float:left;" alt="" /> 
  157.  <table> 
  158.   <tr> 
  159.    <td>Image save as:</td> 
  160.    <td><?php $image_id?></td> 
  161.   </tr> 
  162.   <tr> 
  163.    <td>Height:</td> 
  164.    <td><?php echo $height;?></td> 
  165.   </tr> 
  166.   <tr> 
  167.    <td>Widht:</td> 
  168.    <td><?php echo $width;?></td> 
  169.   </tr> 
  170.   <tr> 
  171.    <td>Upload date:</td> 
  172.    <td><?php echo $image_date;?></td> 
  173.   </tr> 
  174.  </table> 
  175.  <p>You may apply a special effect to your image from the list of option below. 
  176.  Note:saving an image with any of the filters applied <em>can be undone</em> 
  177.  </p> 
  178.  <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post"
  179.   <div> 
  180.    <input type="hidden" name="id" value="<?php echo $image_id;?>"/> 
  181.    Filter:<select name="effect" id=""
  182.     <option value="-1">None</option> 
  183.     <?php  
  184.      echo '<option value="'.IMG_FILTER_GRAYSCALE.'" '
  185.      if(isset($_POST['effect']) && $_POST['effect'] == IMG_FILTER_GRAYSCALE) 
  186.      { 
  187.       echo 'selected="selected"'
  188.      } 
  189.      echo ' >Black and white</option>'
  190.      echo '<option value="'.IMG_FILTER_GAUSSIAN_BLUR.'"'
  191.      if(isset($_POST['effect']) && $_POST['effect'] == IMG_FILTER_GAUSSIAN_BLUR) 
  192.      { 
  193.       echo ' selected="selected"'
  194.      } 
  195.      echo '>Blur</option>'
  196.      echo '<option value="'.IMG_FILTER_EMBOSS.'"'
  197.      if(isset($_POST['effect']) && $_POST['effect'] == IMG_FILTER_EMBOSS) 
  198.      { 
  199.       echo 'selected="selected"'
  200.      } 
  201.      echo '>Emboss</option>'
  202.      echo '<option value="'.IMG_FILTER_NEGATE.'"'
  203.      if(isset($_POST['effect']) && $_POST['effect'] == IMG_FILTER_NEGATE) 
  204.      { 
  205.       echo 'selected="selected"'
  206.      } 
  207.      echo '>Negative</option>'
  208.     ?> 
  209.    </select><br /> 
  210.    <?php  
  211.     echo '<input type="checkbox" name="emb_caption"'
  212.     if(isset($_POST['emb_caption'])) 
  213.     { 
  214.      echo ' checked="checked"'
  215.     } 
  216.     echo ' />Embed caption in image?'
  217.     echo '<br />'
  218.     //添加水印选项 
  219.     echo '<input type="checkbox" name="emb_logo" '
  220.     if(isset($_POST['emb_logo'])) 
  221.     { 
  222.      echo 'checked="checked"'
  223.     } 
  224.     echo ' />Embed watermarked logo in image?'
  225.    ?> 
  226.    <input type="submit" value="Preview" name="submit" /><br /><br /> 
  227.    <input type="submit" value="Save" name="submit" /> 
  228.   </div> 
  229.  </form> 
  230. <?php  
  231. ?> 

这里面主要是添加水印选项,如果选中添加水印则将logo.png作为水印图片和原来的图片合并在一起。

在预览文件中添加了对应的逻辑,代码如下:

  1. <?php  
  2. $dir = 'D:\Serious\phpdev\test\images'
  3. //设置环境变量 
  4. putenv('GDFONTPATH='.'C:\Windows\Fonts'); 
  5. $font = "arial"
  6. if(isset($_GET['id']) && ctype_digit($_GET['id']) && file_exists($dir.'/'.$_GET['id'].'.jpg')) 
  7.  $image = imagecreatefromjpeg($dir.'/'.$_GET['id'].'.jpg'); 
  8. else 
  9.  die('invalid image specified'); 
  10. $effect = (isset($_GET['e'])) ? $_GET['e'] : -1; 
  11. switch($effect
  12.  case IMG_FILTER_NEGATE: 
  13.   imagefilter($image , IMG_FILTER_NEGATE); 
  14.  break
  15.  case IMG_FILTER_GRAYSCALE: 
  16.   imagefilter($image , IMG_FILTER_GRAYSCALE); 
  17.  break;  
  18.  case IMG_FILTER_EMBOSS: 
  19.   imagefilter($image , IMG_FILTER_EMBOSS); 
  20.  break;  
  21.  case IMG_FILTER_GAUSSIAN_BLUR: 
  22.   imagefilter($image , IMG_FILTER_GAUSSIAN_BLUR); 
  23.  break;  
  24. if(isset($_GET['capt'])) 
  25.  //echo $_GET['capt']; 
  26.  imagettftext($image, 12, 0, 20, 20, 0, $font$_GET['capt']); 
  27. if(isset($_GET['logo'])) 
  28.  list($widht , $height) = getimagesize($dir.'/'.$_GET['id'].'.jpg'); 
  29.  list($wmk_width , $wmk_height) = getimagesize('images/logo.png'); 
  30.  $x = ($widht-$wmk_width) / 2; 
  31.  $y = ($height-$wmk_height) / 2; 
  32.  $wmk = imagecreatefrompng('images/logo.png'); 
  33.  imagecopymerge($image , $wmk , $x , $y , 0 , 0 , $wmk_width , $wmk_height , 20); 
  34.  imagedestroy($wmk); 
  35. header('Content-Type:image/jpeg'); 
  36. imagejpeg($image , '' , 100); 
  37. ?> 

最后上传的水印图片效果如下:

注意主要的逻辑就是通过 imagecopymerge() 方法把两个图片合并在一起造成水印效果。来看看这个方法的方法原型和参数:

bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int$src_x , int $src_y , int $src_w , int $src_h , int $pct )

将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。

以上内容是本文介绍PHP给图片添加水印 压缩 剪切的封装类的全部内容,希望大家对本文介绍感兴趣。

Tags: PHP图片水印 PHP压缩 PHP剪切

分享到: