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 相关文章推荐
PHP 编程安全性小结
Jan 08 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
php正则表达式(regar expression)
Sep 10 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
php实现httpRequest的方法
Mar 13 PHP
PHP连接access数据库
Mar 27 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 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
基于PHPExcel的常用方法总结
2013/06/13 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php把数组值转换成键的方法
2015/07/13 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
简单解析Django框架中的表单验证
2015/07/17 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
保护环境的建议书
2014/03/12 职场文书
有关环保的标语
2014/06/13 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
建设办主任四风问题整改思路和措施
2014/09/20 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
公司感谢信范文
2015/01/22 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android
Python使用openpyxl批量处理数据
2021/06/23 Python
Redis入门教程详解
2021/08/30 Redis