手写 PHP 处理图像:给图片加水印和裁剪

320 查看

<?php
header("content-type:text/html;charset=utf-8");
/**

  • 图像处理类 完成对各种类型的图像进行等比缩放,加图片水印和裁剪的操作
  • @author Administrator
  • .jpg .png .gif 经过测试
    */
    class Image{

    private $path;//待操作图片的路径

    /**

    • 构造函数用来创建图像的一个目录,默认值是当前目录
      */
      function __construct($path='./'){
      if (!file_exists($path)){ //检查输入的路径是否正确
      die("找不到,输入的不是一个正确路径!");
      }
      $this->path=$path;
      }

    /**

    • 对图像缩放的处理
    • @param int $width //缩放后的宽度
    • @param int $height //缩放后的高度
    • @param string $name //缩放后生成的文件名称前缀(+原来的文件名)
    • @备注 如果此方法 出现了报错 很有可能是图片本身的格式被篡改
      */
      function suofang($width,$height,$name){
      list($src_width,$src_height)=getimagesize($this->path);//获得原图片的高宽
      if($width>$src_width$height>$src_height){
      die ("输入错误,缩放后的宽度和高度不能大于图片本身的高度 和宽度");
      }
      $dst_image=imagecreatetruecolor($width, $height);//创建缩放后的画布资源
      $path= "imagecreatefrom".$this->file_type($this->path);
      $src_image=$path($this->path); //原图片资源

      imagecopyresized($dst_image, $src_image, 0, 0, 0, 0, $width, $height, $src_width, $src_height);

      $path1="image".$this->file_type($this->path);//类似于imagejpeg();

      $name=$name.basename($this->path);//组合新的文件名称
      if($path1($dst_image,dirname($this->path)."/".$name)){
      echo "图片缩放操作成功!";
      }else{
      echo "图片缩放操作失败!请检查源代码";
      }
      //关闭img图像资源
      imagedestroy($dst_image);
      imagedestroy($src_image);
      }
      /**

    • 本类为图片增加图片或文字水印
    • @param int $mode (1 or 2 ) 模式 1:为图片添加字符串水印,2:为图片添加图片水印
    • @param string $content 若第一个参数 为1,则$content为待添加的字符串或图片地址
    • @param int $position 位置1~9分别代表了左上角到右下角 依次类推
    • @param string $name 生成的带水印图片的名称
      */
      function shuiyin_ImgOrText($mode,$content,$position,$name){
      if($mode!=1&&$mode!=2){
      die ("第一个参数必须为1 or 2");
      }elseif($mode==1){
      $path1="imagecreatefrom".$this->file_type($this->path);
      $image=$path1($this->path);
      $size=50;
      //$content=iconv("GB2312", "UTF-8",$content); //调整编码问题为防止有中文出现会有乱码问题
      $red=imagecolorallocate($image, 255, 0, 0);
      if(!copy("C:\WINDOWS\Fonts\simsun.ttc", "./simsun.ttc")){ //将字体配置文件simsun.ttc复制到工作目录下
      die("字体配置导入失败!");

      }
      $fontfile="simsun.ttc";
      if($position<1$position>9){
      
          die("第三个参数必须是1~9的数字");
      }
      $arr=array();
      $arr=$this->position($position);
      
      imagettftext($image, $size, 0, $arr[0], $arr[1], $red, $fontfile, $content);
      $path="image".$this->file_type($this->path);
      
      if($path($image,dirname($this->path)."/".$name.basename($this->path))){
          echo "增加文字水印成功!";
      }else{
          echo "增加文字水印失败!";
      }
      imagedestroy($image);

      }elseif($mode==2){ //增加图片水印
      if(!file_exists($content)){
      die ("没有查找到该文件");
      }
      $path1="imagecreatefrom".$this->file_type($this->path);
      $image1=$path1($this->path); //源图片(待增加水印)
      $path="imagecreatefrom".$this->file_type($content);
      $image=$path($content);
      $arr=array();
      $arr=$this->position($position);

      //自设参数
      $src_x=200; //水印图从距(0,0)横坐标为200的地方开始截取
      $src_y=200; //水印图从距(0,0)纵坐标为200的地方开始截取
      $src_w=200; //截取水印图的宽度
      $src_h=200; //截取水印的高度
      imagecopy($image1, $image, $arr[0],$arr[1], $src_x, $src_y, $src_w, $src_h);
      $paths= "image".$this->file_type($this->path);
      if($paths($image1,dirname($this->path)."/".$name.basename($this->path))){
          echo "增加文字水印成功!";
      }else{
          echo "增加文字水印失败!";
      }
      imagedestroy($image1);
      imagedestroy($image);

      }
      }

    /**

    • @param int $src_x 裁剪距上边的距离
    • @param int $src_y 裁剪距左边的距离
    • @param int $src_w 裁剪的k宽度
    • @param int $src_h 裁剪的高度
    • @param string $name
      */
      function img_jianqie($src_x,$src_y,$src_w, $src_h,$name){
      $dst_image=imagecreatetruecolor($src_w, $src_h);
      list($width1,$height1)=getimagesize($this->path);
      if($src_w>$width1$src_h>$height1){
      die("错误!指定的宽和高大于原图片的宽高");
      }
      $path="imagecreatefrom".$this->file_type($this->path);
      $src_image=$path($this->path);
      imagecopyresampled($dst_image, $src_image, 0, 0, $src_x, $src_y, $src_w, $src_h, $src_w, $src_h);
      $path1="image".$this->file_type($this->path);
      if($path1($dst_image,dirname($this->path)."/".$name.basename($this->path))){

      echo "图片剪切操作成功!";

      }else{
      echo "图片剪切操作失败!";
      }
      imagedestroy($dst_image);
      imagedestroy($src_image);

    }

    /**

    • 根据$position来确定水印的位置 1~9 九宫格 从左上 到右下
    • @param int $position 位置标符
      /
      private function position($position){
      $arr=array();
      list($width,$height)=getimagesize($this->path);
      $a=60; //初始位于图片边缘的间隔
      switch($position){
      case 1: $x=$y=$a; break;
      case 2: $x=$width/3+$a;$y=$a;break;
      case 3: $x=$width/3
      2+$a;$y=$a;break;
      case 4: $x=$a;$y=$height/3+$a;break;
      case 5: $x=$width/3+$a;$y=$height/3+$a;break;
      case 6: $x=$width/32+$a;$y=$height/3+$a;break;
      case 7: $x=$a;$y=$height/3
      2+$a;break;
      case 8: $x=$width/3+$a;$y=$height/32+$a;break;
      case 9: $x=$width/3
      2+$a;$y=$height/3*2+$a;break;
      default: die("发生了错误!");
      }

      $arr[]=(int)$x;
      $arr[]=(int)$y;
      return $arr;
      }

    /**

    • 判断图片为什么类型
    • @param string $url 为文件路径
    • @return string $type 文件类型
      */
      private function file_type($url){

      $url= substr($url, strtolower(strrpos($url,'.')+1)); //截取字符串获得 后缀
      $url=='jpg'?$url='jpeg':$url;
      return $url;

    }
    /**

    • 错误处理类
      */
      private function error(){
      error_reporting(0); //关闭所有错误报告!

      /**

      • @param int $error_level 错误级别
      • @param string $error_message 错误信息
      • @param string $file 错误发生的文件
      • @param unknown $line 错误的行号
        */
        function error_handler($error_level,$error_message,$file,$line){
        switch ($error_level){
        case E_NOTICE:
        case E_USER_NOTICE:
        $error_type='notice';break;
        case E_WARNING:
        case E_USER_WARNING:
        $error_type='WARNING';break;
        case E_ERROR:
        case E_USER_ERROR:
        $error_type='error';break;
        default:
        $error_type='unknown';
        }
        $message="时间为:".date("Y-m-d H:i:s"). "发生了".$error_type."错误在第".$file."文件的".$line."行,错误信息为:".$error_message."\r\n";
        error_log($message,3,"./error.text"); //发送错误指令 到指定的文件夹中

      }
      set_error_handler("error_handler"); //调用自设的回调函数 处理出错的信息
      }

}

$cheng =new Image("d:/img/3.jpg"); //待操作的图片路径
//$cheng ->suofang(200,200,'sf'); //对图片进行缩放操作
//$cheng ->shuiyin_ImgOrText(1, '我就是水印', 6, 'sy');//对图片增加水文字水印的操作

//$cheng ->shuiyin_ImgOrText(2, "d:/img/3.jpg", 6, 'sy');//对图片增加图片水印的操作
$cheng->img_jianqie(200, 200, 300, 300, 'jq'); //对图片进行剪切