IT虾米网

PHP图片添加水印详解

sanshao 2018年06月24日 编程语言 117 0
一共有3个文件:
1、functions.php
2、water.config.php
3、water.class.php
 
代码如下: 
functions.php
<?php 
 
/* 
 *  
 */ 
//获得数据库模型的对象 
function M($table){ 
        return new Model($table); 
} 
//打印信息 
function p($msg){ 
	echo "<pre>"; 
	print_r($msg); 
	echo "</pre>"; 
} 
//提示错误信息 
function error($msg){ 
        echo "<div align='center' style='border:solid 3px #dcdcdc;padding:20px;margin:0 auto;'> 
        $msg 
        </div>"; 
        exit; 
} 
//自动加载类文件 
function __autoload($className){ 
        if(strlen($className)>7 && substr($className,-7) == 'Control'){ 
                $classFile = PATH_APP.'/control/'.$className.'.php'; 
        }else{ 
                $classFile = PATH_XL.'/libs/bin/'.$className.'.class.php'; 
        } 
        if(!is_file($classFile)){ 
                exit($classFile."文件不存在"); 
        } 
        include $classFile; 
} 
//加载、设置配置项 
function C($name=null,$value=null){ 
        static $config =array(); 
        if(is_array($name)){ 
                $config = array_merge($config,array_change_key_case($name)); 
        } 
        if(is_string($name)){ 
                $name = strtolower($name); 
                if(!is_null($value)){ 
                        $congfig[$name]=$value; 
                        return true; 
                } 
                return isset($config[$name])?$config[$name]:null; 
        } 
        if(is_null($name)){ 
                return $config; 
        } 
} 
//加载、设置字体 
function L($name=null,$value=null){ 
        static $lang = array(); 
        if(is_array($name)){ 
                $lang  = array_merge($lang,array_change_key_case($name)); 
        } 
        if(is_string($name)){ 
                $name = strtolower($name); 
                if(!is_null($value)){ 
                        $lang[$name]=$value; 
                        return true; 
                } 
                return isset($lang[$name])?$lang[$name]:null; 
        } 
        if(is_null($name)){ 
                return $lang; 
        } 
} 
//获得文件、文件夹的大小 
function getsize($path,$type=null){ 
        if(is_file($path)) return filesize($path); 
        $type = is_null($type)?"*":"*.$type"; 
        $files = glob($path.'/'.$type); 
        $size = 0; 
        foreach($files as $f){ 
                $size+=is_dir($f)?getsize($f):filesize($f); 
        } 
        return $size; 
} 
?>

water.config.php
<?php 
return array( 
 	//水印处理配置项 
  	'water_img' => 'water.jpg',//水印图片 
  	'water_pos' => '9',//水印位置  取值范围:1-9  
	/* 1-9的位置分别为 
		↖  ↑  ↗ 
		←  ·  → 
		↙  ↓  ↘ 
	*/ 
  	'water_pct' => 60,//水印透明度  取值范围:0-100  (值越大、水印越清晰) 
); 
?>

water.class.php
<?php 
include "functions.php";//加载小工具函数 
C(include "water.config.php");//读取水印类配置项 
//水印处理类 
class waterd{ 
	public $water_pos='';//水印位置 
	public $water_pct='';//水印透明度 
	private $res;//图像资源 
	//构造函数 
	function __construct($pos=null,$pct=null){ 
		$this->water_pos = is_null($pos)?C('water_pos'):$pos; 
		$this->water_pct = is_null($pct)?C('water_pct'):$pct; 
	} 
	//添加水印方法 
	public function water($img){ 
		//检测 
		if(!$this->check($img)){ 
			return false; 
		} 
		//水印图片资源 
		$water_res = $this -> getres(C('water_img')); 
		//原始图片资源 
		$img_res = $this -> getres($img); 
		//水印位置 
		$posArr = $this -> getpos($img_res,$water_res); 
		imagecopymerge($img_res,$water_res,$posArr[0],$posArr[1],0,0,imagesx($water_res),imagesy($water_res),$this->water_pct); 
		$info = getimagesize($img); 
		//打印图片信息 测试时可开启当前打印 p($info); 
		$func = str_replace('/','',$info['mime']); 
		$func($img_res,$img); 
	} 
	//检测 
	private function check($img){ 
		return is_file($img) && extension_loaded('GD') &&  getimagesize($img); 
	} 
	//获得图片资源 
	private function getres($img){ 
		$info = getimagesize($img); 
		$type = trim(image_type_to_extension($info[2]),'.'); 
		$func = 'imagecreatefrom'.$type; 
		return $func($img); 
	} 
	//获得水印位置 
	private function getpos($img_res,$water_res){ 
		$img_x = imagesx($img_res);//原图宽度 
		$img_y = imagesy($img_res);//原图宽度 
		$water_x = imagesx($water_res);//水印宽度 
		$water_y = imagesy($water_res);//水印宽度 
		$pos = $this -> water_pos;//水印位置 
		$x=15;$y=15; 
		switch($pos){ 
			case 1: 
				break; 
			case 2: 
				$x = ($img_x-$water_x)/2; 
				break; 
			case 3: 
				$x = $img_x-$water_x-15; 
				break; 
			case 4: 
				$y = ($img_y-$water_y)/2; 
				break; 
			case 5: 
				$x = ($img_x-$water_x)/2; 
				$y = ($img_y-$water_y)/2; 
				break; 
			case 6: 
				$x = $img_x-$water_x-15; 
				$y = ($img_y-$water_y)/2; 
				break; 
			case 7: 
				$y = $img_y-$water_y-15; 
				break; 
			case 8: 
				$x = ($img_x-$water_x)/2; 
				$y = $img_y-$water_y-15; 
				break; 
			case 9: 
				$x = $img_x-$water_x-15; 
				$y = $img_y-$water_y-15; 
				break; 
		} 
		return array($x,$y); 
	} 
 
} 
//new一个对象然后 调用 水印的方法 water()即可、传进要添加水印的图片即可 
$x = new waterd(); 
$x->water('img.jpg'); 
 
?>

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

jQuery实现密码强度检测详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。