想给Emlog的上传图片加上水印,度娘下网上都是给Emlog安装插件。才多大的事啊,也加插件。
于是动手修改程序。其实在include/lib/function.base.php里面添加水印函数,再修改下文件上传函数upload就可以了。
在function.base.php最末尾,加上新建函数:
/**
* 加盖图片水印
* @param [String] $img [图片路径]
* @param [String] $water [水印图路径]
* @param [String] $save [保存路径|留空则替换原图]
* @return [Boolean]
*/
function water ($img, $water = '', $save = NULL) {
//初始化参数(放进框架时把常量换成 读取配置文件项 )
//$water = empty($water) ? C('WATER_IMAGE') : $water;
$pos = 9; //水印位置
$alpha = 90; ////水印透明度
$compression = 100; ////JPEG图片压缩比
if (!file_exists($water)) return false;
//原图宽、高与类型
$imgInfo = getimagesize($img);
$imgW = $imgInfo[0];
$imgH = $imgInfo[1];
$imgT = getImageType($imgInfo[2]);
//水印图宽、高与类型
$waterInfo = getimagesize($water);
$waterW = $waterInfo[0];
$waterH = $waterInfo[1];
$waterT = getImageType($waterInfo[2]);
//水印图大于原图时不作处理
if ($imgW < $waterW || $imgH < $waterH) return false;
//计算水印位置
$pos = getPosition($imgW, $imgH, $waterW, $waterH, $pos);
$x = $pos['x'];
$y = $pos['y'];
//打开原图资源
$fn = 'imagecreatefrom' . $imgT;
$image = $fn($img);
//打开水印图资源
$fn = 'imagecreatefrom' . $waterT;
$water = $fn($water);
//盖上水印图
if ($waterT == 'png') {
imagecopy($image, $water, $x, $y, 0, 0, $waterW, $waterH);
} else {
imagecopymerge($image, $water, $x, $y, 0, 0, $waterW, $waterH, $alpha);
}
//保存路径
$save = savePath($save, $img);
$fn = 'image' . $imgT;
if ($imgT == 'jpeg') {
$fn($image, $save, $compression);
} else {
$fn($image, $save);
}
//释放资源
imagedestroy($image);
imagedestroy($water);
return true;
}
/**
* 图片类型
* @param [Integer] $typeNum [类型识别号]
* @return [String]
*/
function getImageType ($typeNum) {
switch($typeNum) {
case 1 :
return 'gif';
case 2 :
return 'jpeg';
case 3 :
return 'png';
}
}
/**
* 图片保存路径
* @param [String] $save [保存路径]
* @param [String] $img [原图路径]
* @return [String]
*/
function savePath ($save, $img) {
if (!$save) return $img;
$pathInfo = pathinfo($img);
$path = rtrim($save, '/') . '/';
is_dir($path) || mkdir($path, 0777, true);
return $path . time() . mt_rand(1000, 9999) . '.' . $pathInfo['extension'];
}
/**
* 计算水印图位置
* @param [Integer] $IW [原图宽]
* @param [Integer] $IH [原图高]
* @param [Integer] $WW [水印宽]
* @param [Integer] $WH [水印高]
* @param [Integer] $pos [九宫格位置]
* @return [Array] [x, y]
*/
function getPosition ($IW, $IH, $WW, $WH, $pos) {
$x = 20;
$y = 20;
switch ($pos) {
case 1 :
break;
case 2 :
$x = ($IW - $WW) / 2;
break;
case 3 :
$x = $IW - $WW - 20;
break;
case 4 :
$y = ($IH - $WH) / 2;
break;
case 5 :
$x = ($IW - $WW) / 2;
$y = ($IH - $WH) / 2;
break;
case 6 :
$x = $IW - $WW - 20;
$y = ($IH - $WH) / 2;
break;
case 7 :
$y = $IH - $WH - 20;
break;
case 8 :
$x = ($IW - $WW) / 2;
$y = $IH - $WH - 20;
break;
case 9 :
$x = $IW - $WW - 20;
$y = $IH - $WH - 20;
break;
default :
$x = mt_rand(0, $IW - $WW);
$y = mt_rand(0, $IH - $WH);
}
return array('x' => $x, 'y' => $y);
}
然后找到
if ($size) {
$file_info['width'] = $size[0];
$file_info['height'] = $size[1];
}
在它后面加上一句:
//给图片打上水印
water ($file_info['file_path'], Option::UPLOADFILE_PATH.'water.png');
这样就OK了,上传一个看看,点击看看吧: