| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
10年前发布

PHP图片缩放水印类

/**  * 图片缩放水印类  *  */  class cls_photo  {      protected $waterrate = 0.2; //水印图标在图片上的比例      protected $width = 300; //缩略图默认宽度      protected $height = 200; //缩略图默认高度      protected $padding = 5;  //水印图到边的距离      protected $water_mark = "./water.png";      protected $water_mark_pos = 5;//水印图片位置(1=左上角,2=右上角,3=左下角,4=右下角,5中央)      protected $watermode = 0;// 0缩略图时不打水印 1缩略图时打水印      protected $magick_handle;//图片操作句柄      protected $format = array ( 'jpg','gif','png','jpeg' ); // 图片文件格式限定      protected $smallpic_mode = 2;//默认模式 0为不生成缩略图, 1为裁切缩放 ,2为比例缩放 3为缩放填充模式         /**       * 设置图片类参数       *       * @param $arg 图片参数 多次可放入数组里 如下       * @param $protected 参数值       * array(       *      'waterrate'=>0.2,       *      'water_mark'=>'./water.png',       *      'water_mark_pos'=>4,       *      'smallpic_mode'=>1       *      );       * @return ture/false       */      public function set_args ( $arg,$val="" )      {          $params = array ( 'waterrate','water_mark','water_mark_pos','smallpic_mode','watermode','width','height' );          if ( is_array ( $arg ) )          {              foreach ( $arg as $k =>$v )              {                  if ( in_array ( $k,$params ) )                  {                      $this->$k = $v;                  }              }          }          else          {              if ( empty ( $val ) )              {                  return false;              }              else              {                  if ( in_array ( $arg,$params ) )                  {                      $this->$arg = $val;                  }              }          }          return true;      }         /**       * 图片缩放       *       * @param $src_file 源文件路径       * @param $dst_file 目标文件路径       * @return 缩略图片路径/false       */      public function scale ( $src_file,$dst_file="" )      {          $dst_width  = $this->width;          $dst_height = $this->height;          $mode       = $this->smallpic_mode;          $magic_water_handle = NewMagickWand();          if ( !MagickReadImage ( $magic_water_handle, $src_file ) ) return false;             //类型          $srcext = strtolower ( MagickGetImageFormat ( $magic_water_handle ) );          if ( $srcext=='bmp' )          {              $srcext = 'jpeg';          }          if ( !in_array ( $srcext,$this->format ) ) return false;          //尺寸          $src_width = MagickGetImageWidth ( $magic_water_handle );          $src_height = MagickGetImageHeight ( $magic_water_handle );             //裁切缩放模式          if ( $mode == 1 )          {              $pos_x=$pos_y = 0;//裁切临时位置              $src_widthc = $src_width;//裁切临时宽度              $src_heightc = $src_height;//裁切临时高度              if ( $src_width/$src_height>$dst_width/$dst_height )              {                  $src_widthc = $src_height*$dst_width/$dst_height;                  $pos_x = ( $src_width-$src_widthc ) /2;                 }              else              {                  $src_heightc = $src_width*$dst_height/$dst_width;                  $pos_y = ( $src_height-$src_heightc ) /2;              }              MagickCropImage ( $magic_water_handle,$src_widthc,$src_heightc,$pos_x,$pos_y );//裁切              //因为MagickCropImage函数后,Gif 图像改,但画布不变              $this->magick_handle = NewMagickWand();              MagickNewImage ( $this->magick_handle,$src_widthc,$src_heightc,'#ffffff' );              MagickSetFormat ( $this->magick_handle,$srcext );              MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp,0,0 );              //缩放              MagickScaleImage ( $this->magick_handle, $dst_width, $dst_height );             }          //比例缩放模式          if ( $mode == 2 )          {              if ( $src_width/$src_height>$dst_width/$dst_height )              {                  $dst_height=$dst_width*$src_height/$src_width;              }              else              {                  $dst_width=$dst_height*$src_width/$src_height;              }              $this->magick_handle=$magic_water_handle;//替换              MagickScaleImage ( $this->magick_handle, $dst_width, $dst_height );//缩放          }          //缩放填充模式          if ( $mode == 3 )          {              if ( $src_width/$src_height>$dst_width/$dst_height )              {                  $dst_heightc=$dst_width*$src_height/$src_width;                  $dst_widthc=$dst_width;              }              else              {                  $dst_widthc=$dst_height*$src_width/$src_height;                  $dst_heightc=$dst_height;              }              MagickScaleImage ( $magic_water_handle, $dst_widthc, $dst_heightc );//缩放              $this->magick_handle = NewMagickWand();              MagickNewImage ( $this->magick_handle,$dst_width,$dst_height,$this->smallpic_bgcolor );              MagickSetFormat ( $this->magick_handle,$srcext );              MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp, ( $dst_width-$dst_widthc ) /2, ( $dst_height-$dst_heightc ) /2 );          }          //打水印          if ( $this->watermode == 1 )          {              $this->set_mark();          }          if ( empty ( $dst_file ) )          {              //建立临时文件              $dst_file = tempnam ( $_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG" );          }          MagickWriteImage ( $this->magick_handle, $dst_file );          return $dst_file;      }         /**       * 打水印       *       * @param $src_file 要打水印的图片路径       * @param $dst_file 生产水印的文件保存路径,为空则生产随机临时文件       * @return 水印文件路径/false       */      public function water_mark ( $src_file,$dst_file="" )      {          $this->magick_handle = NewMagickWand();          if ( !MagickReadImage ( $this->magick_handle, $src_file ) )              return false;          $this->set_mark();          if ( empty ( $dst_file ) )          {              //建立临时文件              $dst_file = tempnam ( $_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG" );          }          MagickWriteImage ( $this->magick_handle, $dst_file );          return $dst_file;      }         /**       * 对内接口       * 给图片打水印       *       */      protected  function set_mark()      {             //尺寸          $dst_width = MagickGetImageWidth ( $this->magick_handle );          $dst_height = MagickGetImageHeight ( $this->magick_handle );          //处理水印图          if ( $this->water_mark && is_file ( $this->water_mark ) )          {              $magic_water_handle = NewMagickWand();              MagickRemoveImage ( $magic_water_handle );              if ( MagickReadImage ( $magic_water_handle, $this->water_mark ) )              {                  MagickScaleImage ( $magic_water_handle, $dst_width*$this->waterrate, $dst_width*$this->waterrate*MagickGetImageHeight ( $magic_water_handle ) /MagickGetImageWidth ( $magic_water_handle ) );//缩放水印到图片的1/5                  if ( $this->water_mark_pos == 1 )                  {                      $left = $this->padding;                      $top = $this->padding;                  }                  elseif ( $this->water_mark_pos == 2 )                  {                      $left = $dst_width-$this->padding-MagickGetImageWidth ( $magic_water_handle );                      $top = $this->padding;                  }                  elseif ( $this->water_mark_pos == 3 )                  {                      $left = $this->padding;                      $top = $dst_height -$this->padding-MagickGetImageHeight ( $magic_water_handle );                  }                  elseif ( $this->water_mark_pos == 4 )                  {                      $left = $dst_width-$this->padding-MagickGetImageWidth ( $magic_water_handle );                      $top =$dst_height -$this->padding-MagickGetImageHeight ( $magic_water_handle );                  }                  elseif ( $this->water_mark_pos == 5 )                  {                      $left = ( $dst_width-MagickGetImageWidth ( $magic_water_handle ) ) /2;                      $top = ( $dst_height -MagickGetImageHeight ( $magic_water_handle ) ) /2;                  }                  MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp,$left,$top );              }          }      }  }