本文主要为大家详细介绍了PHP图片水印类的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。
封装PHP的图片水印的类,供大家参考,具体内容如下
<?php
header('Content-type:text/html;charset=utf8');
$img = new Image();
// $img->water('2a.jpg','logo.gif',0);
class Image{
//路径
protected $path;
//是否启用随机名字
protected $isRandName;
//要保存的图像类型
protected $type;
//通过构造方法队成员属性进行初始化
function __construct($path='./',$isRandName=true,$type='png'){
$this->path = $path;
$this->isRandName = $isRandName;
$this->type = $type;
}
//对外公开的水印方法
/**
* @param char $image 原图
* @param char $water 水印图片
* @param char $postion 位置
* @param int $tmp 透明度
* @param char $prefix 前缀
*/
function water($image,$water,$postion,$tmp=100,$prefix='water_'){
//判断这两个图片是否存在
if(!file_exists($image)||!file_exists($water)){
die('图片资源不存在');
}
//得到原图和水印图片的宽高
$imageInfo = self::getImageInfo($image);
$waterInfo = self::getImageInfo($water);
//判断水印图片是否能贴上来
if (!$this->checkImage($imageInfo,$waterInfo)){
die('水印图片太大');
}
//打开图片
$imageRes = self::openAnyImage($image);
$waterRes = self::openAnyImage($water);
//根据水印图片的位置计算水印图片的坐标
$pos = $this->getPosition($postion,$imageInfo,$waterInfo);
//将水印图片贴过来
imagecopymerge($imageRes, $waterRes, $pos['x'], $pos['y'], 0, 0, $waterInfo["width"], $waterInfo["height"], $tmp);
//得到要保存图片的文件名
$newName = $this->createNewName($image,$prefix);
//得到保存图片的路径,也就是文件的全路径
$newPath = rtrim($this->path,'/').'/'.$newName;
//保存图片
$this->saveImage($imageRes,$newPath);
//销毁资源
imagedestroy($imageRes);
imagedestroy($waterRes);
//返回路径
return $newPath;
}
//保存图像资源
protected function saveImage($imageRes,$newPath){
$func = 'image'.$this->type;
//通过变量函数进行保存
$func($imageRes,$newPath);
}
//得到文件名函数
protected function createNewName($imagePath,$prefix){
if ($this->isRandName){
$name = $prefix.uniqid().'.'.$this->type;
}else {
$name = $prefix.pathinfo($imagePath)['filename'].'.'.$this->type;
}
return $name;
}
//根据位置计算水印图片的坐标
protected function getPosition($postion,$imageInfo,$waterInfo){
switch ($postion){
case 1:
$x = 0;
$y = 0;
break;
case 2:
$x = ($imageInfo['width']-$waterInfo["width"])/2;
$y = 0;
break;
case 3:
$x = $imageInfo["width"]- $waterInfo["width"];
$y = 0;
break;
case 4:
$x = 0;
$y = ($imageInfo["height"]-$waterInfo["height"])/2;
break;
case 5:
$x = ($imageInfo['width']-$waterInfo["width"])/2;
$y = ($imageInfo["height"]-$waterInfo["height"])/2;
break;
case 6:
$x = $imageInfo["width"]- $waterInfo["width"];
$y = ($imageInfo["height"]-$waterInfo["height"])/2;
break;
case 7:
$x = 0;
$y = $imageInfo['height'] - $waterInfo["height"];
break;
case 8:
$x = ($imageInfo['width']-$waterInfo["width"])/2;
$y = $imageInfo['height'] - $waterInfo["height"];
break;
case 9:
$x = $imageInfo["width"]- $waterInfo["width"];
$y = $imageInfo['height'] - $waterInfo["height"];
break;
case 0:
$x = mt_rand(0, $imageInfo["width"]- $waterInfo["width"]);
$y = mt_rand(0, $imageInfo['height'] - $waterInfo["height"]);
break;
}
return ['x'=>$x , 'y'=>$y];
}
protected function checkImage($imageInfo,$waterInfo){
if (($waterInfo['width'] > $imageInfo['width'])||($waterInfo['height'] > $imageInfo['height'])){
return false;
}
return true;
}
//静态方法。根据图片的路径得到图片的信息,宽度,高度、mime类型
static function getImageInfo($imagePath){
$info = getimagesize($imagePath);
$data['width']=$info[0];
$data['height']=$info[1];
$data['mime'] = $info['mime'];
return $data;
}
static function openAnyImage($imagePath){
//得到图像的mime类型
$mime = self::getImageInfo($imagePath)['mime'];
//根据不同的mime类型打开不同的图像
switch ($mime){
case 'image/png':
$image = imagecreatefrompng($imagePath);
break;
case 'image/gif':
$image = imagecreatefromgif($imagePath);
break;
case 'image/jpeg':
$image = imagecreatefromjpeg($imagePath);
break;
case 'image/wbmp':
$image = imagecreatefromwbmp($imagePath);
break;
}
return $image;
}
}补充:PHP如何实现根据图片色区位置加水印呢? 具体实现方法如下: function add_wm($nmw_water, $src_file, $output_file, $x, $y) {
if(file_exists($output_file))
return;
$w1 = MagickGetImageWidth($nmw_water);
$h1 = MagickGetImageHeight($nmw_water);
$nmw =NewMagickWand();
MagickReadImage($nmw, $src_file);
// 默认的加水印位置调整
$lt_w = 50;
$lt_h = 50;
if($x == 0){
$w = MagickGetImageWidth($nmw);
$h = MagickGetImageHeight($nmw);
$x = $w;
$y = $h;
}else{
// 根据具体情况调整
$lt_w = 30;
$lt_h = 40;
}
MagickCompositeImage($nmw, $nmw_water, MW_OverCompositeOp, $x - $w1 - $lt_w, $y - $h1 - $lt_h);
MagickWriteImage($nmw, $output_file);
DestroyMagickWand($nmw);
}
// 还是groovy的eachFileRecurse好用啊
function add_wm_recurse($nmw_water, $to_dir, $output_dir, $arr) {
$dp = dir($to_dir);
while($file=$dp->read()){
if($file != '.' && $file != '..'){
if(is_dir($to_dir . '/' . $file)){
mkdir($output_dir . '/' . $file);
add_wm_recurse($nmw_water, $to_dir . '/' . $file, $output_dir . '/' . $file, $arr);
}else{
if(!array_key_exists($to_dir . '/' . $file, $arr)){
continue;
}
$sub_arr = $arr[$to_dir . '/' . $file];
if($sub_arr){
$x = intval($sub_arr[0]);
$y = intval($sub_arr[1]);
add_wm($nmw_water, $to_dir . '/' . $file, $output_dir . '/' . $file, $x, $y);
}
}
}
}
$dp->close();
}
$to_dir = './resized';
$output_dir = './output';
// 这个是我用java的ImageIO遍历图片像素获取的符合裤子颜色的区域的坐标array(posX, posY)
$arr = array(
array(50, 50)
);
$water = './water.png';
$nmw_water =NewMagickWand();
MagickReadImage($nmw_water, $water);
add_wm_recurse($nmw_water, $to_dir, $output_dir, $arr);
DestroyMagickWand($nmw_water);相关推荐 |