根据图片色阶确定位置打水印
为了防止一个网上商铺的图片被别人轻易做处理后试用,就想法做批量水印处理——此类工具很多,但具体这个需求有几点一般软件搞不定的
?
1. 判断加水印的位置(裤子)——根据室内、室外区别——主要根据一定范围的颜色RGB值处于裤子颜色范围内。
2. 文件夹递归并保持路径一致。
3. 因为有些图片当宽大于高时,需要逆时针旋转
?
以上需求我想用imagemagick + bash在linux下应该都可以实现的,可惜偶shell学得太差了。所以求助可爱可恨的java。。。
?
?翻翻API还是用基于ImageMagick的好使——所以先在网上找找例子试用下——一试不当紧,JMagick.jar不管怎么搞libJMagick.so位置,就是报错。最后怒了——换Php的magickwand了。。。下载下来php.ini里加下就可以了。
?
贴代码。。。
?
<?phpfunction 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);?>?