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录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
php 静态变量与自定义常量的使用方法
Jan 26 PHP
PHP投票系统防刷票判断流程分析
Feb 04 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 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
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
PHP新手上路(七)
2006/10/09 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
React 组件间的通信示例
2018/06/14 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
Python urllib.request对象案例解析
2020/05/11 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
什么是事务?事务有哪些性质?
2012/03/11 面试题
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
学校岗位设置方案
2014/01/16 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript