一位以前的客户联系我说他们的系统当初没有做水印,现在想给以前的图片增加水印,同时以后上传图片的时候自动加水印。

上传图片增加水印比较容易处理,改改代码就行了。

问题在于已经上传的几千张图片的水印不知道怎么加,找我给他们处理一下(ps:我不是系统开发者)。

系统本身用ThinkPHP3.2 开发的,就写了个Controller,整合到系统中去,这样子不需要对系统本身做特别大的变动,准确的说复制进点东西就行了。

关键问题是本地文件图片的遍历和筛选以及中文处理(我也不知道威慑么保存中文图片)。

代码如下 改一改Controller(我发的是我在自己电脑上做的IndexController)的名字就可以直接复制进去,当然View/Index复不复制无所谓。

 

/*
*
*	使用thinkphp 循环为已经上传的图片添加水印
*
*	by postbird
*
*   http://www.ptbird.cn
*
*	2016-10-11	
*
*	license MIT
*
*/

namespace Home\Controller;
use Think\Controller;

class IndexController extends Controller {
    public function index(){
    	$this->imageWater('./Public/images/');
    	//调用最终的imageWater水印处理
        $this->display();
    }

    //第一次遍历路径文件夹的内容  得到所有文件
    //参数为实体路径 - 注意不能使用http的路径
    //thinkphp的controller相对于跟路径就是 ./
    //这里用的  ./Public/images/
	public function getImagesPath($rootPath){
		//路径分割
		$rootPath .= substr($rootPath, -1) == '/' ? '' : '/';
		//存取第一次遍历结果
	    $dirPathInfo = array();
	    foreach (glob($rootPath.'*') as $item) {
	    	//必须进行中文转码,中文会乱码
	    	$item = iconv('GB2312','UTF-8',$item);
	        $dirPathInfo [] = $item; 
	        if(is_dir($item)){
	        	//递归遍历子目录
	            $dirPathInfo = array_merge($dirPathInfo, $this->getImagesPath($item));
	        }
	    }
	    return $dirPathInfo;
	    //第一次遍历得到的东西很多,包括子文件夹名称、所有格式的文件
	    //这里为了以后遍历其他文件能用,没有进行格式获取
	}

    //对第一次遍历的文件进行处理和筛选
    //这个函数可以根据需要进行不同文件内容的筛选 这里筛选 jpg\png\jpeg\gif
    //参数是路径 path
    public function allImages($path){
    	//存储最后有图片allImages内容
    	$trueImages=array();
    	$count=0;//计数标记
    	//调用第一次遍历,参数path,返回第一次遍历的而所有内容
    	$allImages=$this->getImagesPath($path);
    	for($i=0;$i<count($allImages);$i++){ //首先将子目录名称去掉 //通过分割 / 得到每个路径分割后的内容 $tempStr=explode("/",$allImages[$i]); //由于子目录名称没有后续内容 因此再次通过.分割上面分割的内容 子目录被剔除 //同时得到文件的后缀 tempImage[0]是分割的文件名称 tempImage[1]是后缀 $tempImage=explode(".",$tempStr[count($tempStr)-1]); //进行后缀的比较 得到需要的图片 if($tempImage[1]=="jpg" || $tempImage[1]=="png" || $tempImage[1]=="jpeg" || $tempImage[1]=="gif" ){ //这里需要注意的是 最后我们需要的是完整的路径 因此最后保存的还是 $allImages[$i] //也就是第一次遍历出来的内容 只不过这个过程中我们剔除了不需要的文件 $trueImages[$count]=$allImages[$i]; $count++; }else{ continue; } } return $trueImages; //返回最后真正需要的图片 } //进行水印处理 // 参数是路径 path 最后 path是用在第一次遍历身上的 public function imageWater($path){ //得到所有需要处理的图片 $images=$this->allImages($path);
    	//使用Image类
		$image = new \Think\Image(); 
		//循环遍历图片
		for($i=0;$i<count($images);$i++){ //同样保存到文件中的过程中需要进行 转码成GB2312 $images[$i] = iconv('UTF-8','GB2312',$images[$i]); //打开原图片添加水印到左上角 并保存为原来位置和名称 自动覆盖 //关于水印位置和选项可以参照 thinkphp3.2 手册 // http://document.thinkphp.cn/manual_3_2.html#image //水印位置是存放在根目录下 water.png 可以根据自己需要改 //但是注意不能放在扫描的目录下 $image->open($images[$i])->water('./water.png',\Think\Image::IMAGE_WATER_NORTHWEST)->save($images[$i]);
			echo "成功处理第".$i."张图片...
";
		}
    }
    
}