php实现多张图片上传加水印技巧


Posted in PHP onApril 18, 2013
<?php 
function imageWaterMark($groundImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000") 
{ 
$isWaterImage = FALSE; 
$formatMsg = "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。"; 
//读取水印文件 
if(!empty($waterImage) && file_exists($waterImage)) 
{ 
$isWaterImage = TRUE; 
$water_info = getimagesize($waterImage); //得到的是一个数组 
$water_w = $water_info[0];//取得水印图片的宽 
$water_h = $water_info[1];//取得水印图片的高 
switch($water_info[2])//取得水印图片的格式 
{ 
case 1:$water_im = imagecreatefromgif($waterImage);break; //将图片转化为PHP可识别的编码过程 
case 2:$water_im = imagecreatefromjpeg($waterImage);break; //将图片转化为PHP可识别的编码过程 
case 3:$water_im = imagecreatefrompng($waterImage);break; //将图片转化为PHP可识别的编码过程 
default:die($formatMsg); 
} 
} 
//读取背景图片 
if(!empty($groundImage) && file_exists($groundImage)) 
{ 
$ground_info = getimagesize($groundImage); 
$ground_w = $ground_info[0];//取得背景图片的宽 
$ground_h = $ground_info[1];//取得背景图片的高 
switch($ground_info[2])//取得背景图片的格式 
{ 
case 1:$ground_im = imagecreatefromgif($groundImage);break; 
case 2:$ground_im = imagecreatefromjpeg($groundImage);break; 
case 3:$ground_im = imagecreatefrompng($groundImage);break; 
default:die($formatMsg); 
} 
} 
else 
{ 
die("需要加水印的图片不存在!"); 
} 
//水印位置 
if($isWaterImage)//图片水印 
{ 
$w = $water_w; 
$h = $water_h; 
$label = "图片的"; 
} 
else//文字水印 
{ 
$temp = imagettfbbox(ceil($textFont*2.5),0,"c:/windows/fonts/stcaiyun.ttf",$waterText);//取得使用 TrueType 字体的文本的范围 
$w = $temp[2] - $temp[6]; 
$h = $temp[3] - $temp[7]; 
unset($temp); 
$label = "文字区域"; 
} 
if( ($ground_w<$w) || ($ground_h<$h) ) 
{ 
echo "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!"; 
return; 
} 
switch($waterPos) 
{ 
case 0://随机 
$posX = rand(0,($ground_w - $w)); 
$posY = rand(0,($ground_h - $h)); 
break; 
case 1://1为顶端居左 
$posX = 0; 
$posY = 0; 
break; 
case 2://2为顶端居中 
$posX = ($ground_w - $w) / 2; 
$posY = 0; 
break; 
case 3://3为顶端居右 
$posX = $ground_w - $w; 
$posY = 0; 
break; 
case 4://4为中部居左 
$posX = 0; 
$posY = ($ground_h - $h) / 2; 
break; 
case 5://5为中部居中 
$posX = ($ground_w - $w) / 2; 
$posY = ($ground_h - $h) / 2; 
break; 
case 6://6为中部居右 
$posX = $ground_w - $w; 
$posY = ($ground_h - $h) / 2; 
break; 
case 7://7为底端居左 
$posX = 0; 
$posY = $ground_h - $h; 
break; 
case 8://8为底端居中 
$posX = ($ground_w - $w) / 2; 
$posY = $ground_h - $h; 
break; 
case 9://9为底端居右 
$posX = $ground_w - $w; 
$posY = $ground_h - $h; 
break; 
default://随机 
$posX = rand(0,($ground_w - $w)); 
$posY = rand(0,($ground_h - $h)); 
break; 
} 
//设定图像的混色模式 
imagealphablending($ground_im, true); 
if($isWaterImage)//图片水印 
{ 
imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件 
} 
else//文字水印 
{ 
if( !empty($textColor) && (strlen($textColor)==7) ) 
{ 
$R = hexdec(substr($textColor,1,2)); 
$G = hexdec(substr($textColor,3,2)); 
$B = hexdec(substr($textColor,5)); 
} 
else 
{ 
die("水印文字颜色格式不正确!"); 
} 
imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B)); 
} 
//生成水印后的图片 
@unlink($groundImage); 
switch($ground_info[2])//取得背景图片的格式 
{ 
case 1:imagegif($ground_im,$groundImage);break; //创建gif格式的图片 
case 2:imagejpeg($ground_im,$groundImage);break; //创建jpeg格式的图片 
case 3:imagepng($ground_im,$groundImage);break; //创建png格式的图片 
default:die($errorMsg); 
} 
//释放内存 
if(isset($water_info)) unset($water_info); 
if(isset($water_im)) imagedestroy($water_im); 
unset($ground_info); 
imagedestroy($ground_im); 
} 
?> 
<?php 
for ($i=0;$i<count($_FILES['userfile']['tmp_name']);$i++) 
{ 
$upfile="./img/".($i+1).".png";//此处路径换成你的 
if(move_uploaded_file($_FILES['userfile']['tmp_name'][$i],$upfile)){ 
imageWaterMark($upfile,9,"./shuiyin.png","Made By Chenduan",5,"#FF0000"); 
/* 
* 功能:图片水印 (水印支持图片或文字) 
* imageWaterMark($groundImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000") 
* 参数: 
* $groundImage 背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式; 
* $waterPos 水印位置,有10种状态,0为随机位置; 
* 1为顶端居左,2为顶端居中,3为顶端居右; 
* 4为中部居左,5为中部居中,6为中部居右; 
* 7为底端居左,8为底端居中,9为底端居右; 
* $waterImage 图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式; 
* $waterText 文字水印,即把文字作为为水印,支持ASCII码,不支持中文; 
* $textFont 文字大小,值为1、2、3、4或5,默认为5; 
* $textColor 文字颜色,值为十六进制颜色值,默认为#FF0000(红色); 
*/ 
echo "<img src=\"".$upfile."\" border=\"0\">"; 
echo "第".($i+1)."张图片操作成功<br>"; 
} 
else{ 
echo "第".($i+1)."张图片上传不了<br>"; 
} 
} 
?>
PHP 相关文章推荐
php IP转换整形(ip2long)的详解
Jun 06 PHP
php输出全球各个时区列表的方法
Mar 31 PHP
php显示时间常用方法小结
Jun 05 PHP
分享PHP计算两个日期相差天数的代码
Dec 23 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
Symfony2函数用法实例分析
Mar 18 PHP
示例详解Laravel的注册重构
Aug 14 PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 PHP
Laravel实现autoload方法详解
May 07 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
PHP如何解决微信文章图片防盗链
Dec 09 PHP
基于initPHP的框架介绍
Apr 18 #PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 #PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 #PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
Apr 15 #PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 #PHP
关于PHP递归算法和应用方法介绍
Apr 15 #PHP
PHP 读取Postgresql中的数组
Apr 14 #PHP
You might like
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
用来给图片加水印的PHP类
2008/04/09 PHP
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php中namespace use用法实例分析
2016/01/22 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
基于javascript实现随机颜色变化效果
2016/01/14 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
python操作MongoDB基础知识
2013/11/01 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
.NET remoting中对象激活的两种方式
2015/06/08 面试题
医院门卫岗位职责
2013/12/30 职场文书
超市促销活动总结
2014/07/01 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android