欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

php水印图类

程序员文章站 2022-05-18 11:23:27
...

图片加上标签 无 ?phprequire( './WaterMark.class.php' );$water = new WaterMark( './images/psb.jpg', './images/200(1).jpg' );$water-Exec( './images/w.jpg', 'center-center' );? ?php/** * Add water stain to specified image * @author pankai53091

图片加上标签
Exec( './images/w.jpg', 'center-center' );
?>

 * @date 2013-09-27
 */
class WaterMark {
	/* Image source path */
	private $_src_path = NULL;
	private $_image_source = NULL;
	
	/* Water-Stain image source path */
	private $_water_path = NULL;
	private $_water_source = NULL;
	
	private $_extension = NULL;
	
	public function __construct( $_src_path, $_water_path ) {
		$this->_src_path = $_src_path;
		$this->_water_path = $_water_path;
	}
	
	/**
	 * Get image source form image designated path
	 * @param $_img_path
	 * @return resource 
	 */
	private function getImageSource( $_img_path ) {
		$_path = explode( ".", strtolower( $_img_path ) );
		$_bak = strtoupper( $_path[ sizeof( $_path ) - 1 ] );
		$_img_source = NULL;
		$this->_extension = $_bak;
		
		switch( $_bak ) {
			case "GIF":
				$_img_source = @imagecreatefromgif( $_img_path );
				break;
			case "JPG":
			case "JPEG":
				$_img_source = @imagecreatefromjpeg( $_img_path );
				break;
			case "PNG":
				$_img_source = @imagecreatefrompng( $_img_path );
				break;
			case "WBMP":
				$_img_source = @imagecreatefromwbmp( $_img_path );
				break;
		}

		return $_img_source;
	}
	
	/**
	 * Count coordinate
	 * @param $direction string
	 * @return array
	 */
	private function countArgs( &$_src, &$_water, $_direction ) {
		$_args = NULL;
		/** 
		 * Count the image's width and image's height 
		 * 		which are used to show Water-Stain image arbitrarily
		 */
		$src_x = imagesx( $_src );
		$src_y = imagesy( $_src );
		
		$water_x = imagesx( $_water );
		$water_y =  imagesy( $_water );
		
		switch( strtolower( $_direction ) ) {
			case 'top-left':
				$_args = array( 0, 0 );
				break;
			case 'top-center':
				$_args = array( floor( ( $src_x - $water_x ) / 2 ), 0 );
				break;
			case 'top-right':
				$_args = array( $src_x - $water_x, 0 );
				break;
			case 'center-left':
				$_args = array( 0, floor( ( $src_y - $water_y ) / 2 ) );
				break;
			case 'center-center':
				$_args = array( floor( ( $src_x - $water_x ) / 2 ), floor( ( $src_y - $water_y ) / 2 )  );
				break;
			case 'center-right':
				$_args = array( $src_x - $water_x, floor( ( $src_y - $water_y ) / 2 )  );
				break;
			case 'bottom-left':
				$_args = array( 0, $src_y - $water_y );
				break;
			case 'bottom-center':
				$_args = array( floor( ( $src_x - $water_x ) / 2 ), $src_y - $water_y );
				break;
			case 'bottom-right':
				$_args = array( $src_x - $water_x, $src_y - $water_y  );
				break;
		}
		
		return $_args;
	}
	
	/**
	 * The main programmer: copy Water-Stain image source into specified image source,
	 * 		then save this into appointed path
	 * @param $dst_name
	 * @return bool
	 */
	public function Exec( $dst_name, $direction = 'bottom-right' ) {
		$this->_image_source = &$this->getImageSource( $this->_src_path );
		$this->_water_source = &$this->getImageSource( $this->_water_path );
		
		$water_x = imagesx( $this->_water_source );
		$water_y =  imagesy( $this->_water_source );
		
		$_args = $this->countArgs( $this->_image_source, $this->_water_source, $direction );
		
		$_copy = imagecopy( $this->_image_source, $this->_water_source, 
			abs( $_args[ 0 ] ), abs( $_args[ 1 ] ), 0, 0, $water_x, $water_y );
		
		$_out = true;
		/* imagejpeg( $this->img_dst, $dst_name, 100 ); */
		switch ( $this->_extension ) {
			case 'GIF':
				$_out = imagegif( $this->_image_source, $dst_name );
				break;
			case 'JPG':
			case 'JPEG':
				$_out = imagejpeg( $this->_image_source, $dst_name, 100 );
				break;
			case 'PNG':
				$_out = imagepng( $this->_image_source, $dst_name );
				break;
			case 'WBMP':
				$_out = imagewbmp( $this->_image_source, $dst_name );
		}
		
		return $_copy && $_out;	
	}
}
?>