PHP圖片縮放水印類

jopen 9年前發布 | 1K 次閱讀 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 );
       }
      

      } } }</pre>

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