PHP实现根据图片色界在不同位置加水印的方法


Posted in PHP onAugust 08, 2015

本文实例讲述了PHP实现根据图片色界在不同位置加水印的方法。分享给大家供大家参考。具体如下:

在使用php编程的时候, 很多时候需要对上传的图片加水印,来确定图片版权和出处. 但是,一般情况下加水印的位置是图片的右下角, 但是,不同图片的色阶不同,有时候我们 图片的水印和图片本身色阶相同,就会造成水印不明显.

下面这段代码可以实现自动识别图片的色阶,更加色阶差来添加图片的水印,这样可以避免水印和图片色阶一样的弊端.

<?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);
?>

补充:

PHP图像处理模块 MagickWand用法

MagickWand 是一个PHP的模块,用来访问 ImageMagick 的图像处理库。下面是一个使用 MagicWand 的代码片段:

$magick_wand=NewMagickWand();
MagickReadImage($magick_wand,'rose.jpg');
$drawing_wand=NewDrawingWand();
DrawSetFont($drawing_wand,"/usr/share/fonts/bitstream-vera/Vera.ttf");
DrawSetFontSize($drawing_wand,20);
DrawSetGravity($drawing_wand,MW_CenterGravity);
$pixel_wand=NewPixelWand();
PixelSetColor($pixel_wand,"white");
DrawSetFillColor($drawing_wand,$pixel_wand);
if (MagickAnnotateImage($magick_wand,$drawing_wand,0,0,0,"Rose") != 0)
{
 MagickEchoImageBlob( $magick_wand );
}
else
{
 echo MagickGetExceptionString($magick_wand);
}
?>

安装方法:

1. 下载 php_magickwand_q16_st.dll for 5.2.x
2. 将其放在PHP的扩展目录
3. 在php.ini文件总增加 extension=php_magickwand_q16_st.dll
4. 重新启动apache

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
超级简单的发送邮件程序
Oct 09 PHP
在线增减.htpasswd内的用户
Oct 09 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
php抓取页面的几种方法详解
Jun 17 PHP
PHP命名空间和自动加载类
Apr 03 PHP
php parse_str() 函数的定义和用法
May 23 PHP
php微信支付接口开发程序
Aug 02 PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
PHP针对redis常用操作实例详解
Aug 17 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 #PHP
smarty中常用方法实例总结
Aug 07 #PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 #PHP
PHP下载生成的csv文件及问题总结
Aug 06 #PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 #PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 #PHP
php实现无限级分类(递归方法)
Aug 06 #PHP
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
用javascript操作xml
2006/11/04 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
设置python3为默认python的方法
2018/10/31 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python自动化操作实现图例绘制
2020/07/09 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
土木工程应届生自荐信
2013/09/24 职场文书
应用化学专业职业生涯规划书
2013/12/31 职场文书
土建施工员岗位职责
2014/07/16 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
党员证明模板
2015/06/19 职场文书
七年级语文教学反思
2016/03/03 职场文书
Golang并发工具Singleflight
2022/05/06 Golang