封装水印函数
<?php
/*
验证码
宽 高 字母 数字 字母数字混合 干扰线 干扰点 背景色(要比字体颜色浅) 字体的颜色
*/
/**
* @param $source:资源(大图)
* @param $water:小图
* @param $position:位置(默认9个位置)
* @param $alpha:透明度
* @param $type:输出图片的类型
* @param $path:存放路径
* @param $isRandName:是否随机命名
*/
warterMark('big.jpg');
function warterMark($source, $water = 'icon.png', $position = 8,$alpha = 100, $type = 'jpeg', $path = 'test', $isRandName = false){
// 1.打开图片
$sourceRes = open($source);
// var_dump($sourceRes);
$waterRes = open($water);
// 2.获取图片大小,算出位置
$sourceInfo = getimagesize($source);
$waterInfo = getimagesize($water);
// 如果图片小于水印图片,不生成图片
if ($sourceInfo[0] < $waterInfo[0] || $sourceInfo[1] < $waterInfo[1]){
exit('水印图片过大');
}
// 3.算出位置
switch ($position) {
case 1:
$x = 0;
$y = 0;
break;
case 2:
$x = ($sourceInfo[0] - $waterInfo[0]) / 2;
$y = 0;
break;
case 3:
$x = $sourceInfo[0] - $waterInfo[0];
$y = 0;
break;
case 4:
$x = 0;
$y = ($sourceInfo[1] - $waterInfo[1]) / 2;
break;
case 5:
$x = ($sourceInfo[0] - $waterInfo[0]) / 2;
$y = ($sourceInfo[1] - $waterInfo[1]) / 2;
break;
case 6:
$x = $sourceInfo[0] - $waterInfo[0];
$y = ($sourceInfo[1] - $waterInfo[1]) / 2;
break;
case 7:
$x = 0;
$y = $sourceInfo[1] - $waterInfo[1];
break;
case 8:
$x = ($sourceInfo[0] - $waterInfo[0]) / 2;
$y = $sourceInfo[1] - $waterInfo[1];
break;
case 9:
$x = $sourceInfo[0] - $waterInfo[0];
$y = $sourceInfo[1] - $waterInfo[1];
break;
default:
$x = mt_rand(0, $sourceInfo[0] - $waterInfo[0]);
$y = mt_rand(0, $sourceInfo[1] - $waterInfo[1]);
break;
}
// 4.把x y求出来的值供两张图片合并的时候使用
imagecopymerge($sourceRes, $waterRes, $x, $y, 0, 0,$waterInfo[0], $waterInfo[1], $alpha); // 拷贝并合并图像的一部分
$func = 'image'.$type;
/*
imagepng();
imagejpeg();
imagewbmp();
*/
// 5.处理path路径,是否启用随机文件名
if($isRandName){
$name = uniqid() . '.' . $type; //echo uniqid();随机串
}else{
$pathinfo = pathinfo($source);
// var_dump($pathinfo);
$name = $pathinfo['filename'] . '.' . $type;
}
$path = rtrim($path, '/') . '/' . $name;
$func($sourceRes, $path);
imagedestroy($sourceRes);
imagedestroy($waterRes);
}
// 打开图片的函数
function open($path){
// 判断是否存在
if(!file_exists($path)){
exit('文件不存在');
}
$info = getimagesize($path);
// var_dump($info);
// 根据图片原信息,生成新的图片
switch($info['mime']){
case 'image/jpeg':
case 'image/jpg':
case 'image/pjpeg':
$res = imagecreatefromjpeg($path); // 由文件或URL创建一个新图像,返回一个新的资源
break;
case 'image/png':
$res = imagecreatefrompng($path);
break;
case 'image/gif':
$res = imagecreatefromgif($path);
break;
case 'image/wbmp':
case 'image/bmp':
$res = imagecreatefromwbmp($path);
break;
}
return $res;
}
目录结构
生成图片的问题:png半透明的图片不能生成透明图,可以绘制字体水印效果更好。