實現縮略圖和加水印的php類

phpde1 9年前發布 | 771 次閱讀 PHP

/**

  • 圖片縮放水印類 *

    • @version 1.0 ; / 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);
         }
        

        } } }</pre>

 本文由用戶 phpde1 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!