论坛首页 编程语言技术论坛

根据图片色阶确定位置打水印

浏览 2066 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-03  
PHP

为了防止一个网上商铺的图片被别人轻易做处理后试用,就想法做批量水印处理——此类工具很多,但具体这个需求有几点一般软件搞不定的

 

1. 判断加水印的位置(裤子)——根据室内、室外区别——主要根据一定范围的颜色RGB值处于裤子颜色范围内。

2. 文件夹递归并保持路径一致。

3. 因为有些图片当宽大于高时,需要逆时针旋转

 

以上需求我想用imagemagick + bash在linux下应该都可以实现的,可惜偶shell学得太差了。所以求助可爱可恨的java。。。

 

 翻翻API还是用基于ImageMagick的好使——所以先在网上找找例子试用下——一试不当紧,JMagick.jar不管怎么搞libJMagick.so位置,就是报错。最后怒了——换Php的magickwand了。。。下载下来php.ini里加下就可以了。

 

贴代码。。。

 

<?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);
?>
 
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics