php实现水印图功能.
测试水印的文件代码:
<?php
require( './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 pankai<>
* @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;
}
}
?>
更多信息请查看IT技术专栏