php图片加中文水印实现代码分享


Posted in PHP onOctober 31, 2012

例1

<?php 
Header("Content-type: image/png"); /*通知浏览器,要输出图像*/ 
$im = imagecreate(400 , 300); /*定义图像的大小*/ 
$gray = ImageColorAllocate($im , 235 , 235 , 235); 
$pink = ImageColorAllocate($im, 255 , 128 , 255); 
$fontfile = "simkai.ttf"; 
/* $fontfile 字体的路径,视操作系统而定,可以是 simhei.ttf(黑体) , SIMKAI.TTF(楷体) , SIMFANG.TTF(仿宋) ,SIMSUN.TTC(宋体&新宋体) 等 GD 支持的中文字体*/ 
$str = iconv('GB2312','UTF-8','中文水印'); /*将 gb2312 的字符集转换成 UTF-8 的字符*/ 
ImageTTFText($im, 30, 0, 100, 200, $pink , $fontfile , $str); 
/* 加入中文水印 */ 
Imagepng($im); 
ImageDestroy($im); 
?>

例2
<?php 
// **************************************** // 
// 功能:给图片添加文字 
// 参数: $img 图片文件名 
// $new_img 另存图片文件名,如果为空表示不另存图片 
// $text 字符串内容 
// text_size 字符串大小 
// text_angle 字型串输出角度 
// text_x 字符串输出 x 坐标 
// text_y 字符串输出 y 坐标 
// $text_font 字型文件名 
// $r,$g,$b 字符串颜色RGB值 
// **************************************** // 
function img_text($img, $new_img, $text, $text_size, $text_angle, $text_x, $text_y, $text_font, $r, $g, $b){ 
$text=iconv("gb2312","UTF-8",$text); 
Header("Content-type: image/gif"); 
$im = @imagecreatefromstring(file_get_contents($img)) or die ("打开图片失败!"); 
$color = ImageColorAllocate($im, $r,$g,$b); 
//ImageTTFText(int im, int size, int angle, int x, int y, int col, string fontfile, string text): 
//本函数将 TTF (TrueType Fonts) 字型文字写入图片。 
//参数: size 为字形的尺寸; 
// angle 为字型的角度,顺时针计算,0 度为水平(由左到右),90 度则为由下到上的文字; 
// x,y 二参数为文字的坐标值 (原点为左上角); 
// col 为字的颜色; 
// fontfile 为字型文件名称; 
// text 是字符串内容。 
ImageTTFText($im, $text_size, $text_angle, $text_x, $text_y, $color, $text_font, $text); 
if ($new_img==""): 
ImageGif($im); // 不保存图片,只显示 
else: 
ImageGif($im,$new_img); // 保存图片,但不显示 
endif; 
ImageDestroy($im); //结束图形,释放内存空间 
} 
?>

例3
<?php 
/* 
* 功能:PHP图片水印 (水印支持图片或文字) 
* 参数: 
* $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(红色); 
* 
* 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG 
* $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。 
* 当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。 
* 加水印后的图片的文件名和 $groundImage 一样。 
* 作者:longware @ 2004-11-3 14:15:13 
*/ 
function imageWaterMark($groundImage,$waterPos=0,$waterImage=”",$waterText=”",$textFont=5,$textColor=”#FF0000″) 
{ 
$isWaterImage = FALSE; 
$formatMsg = “暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。”; 
//读取水印文件 
if(!emptyempty($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; 
case 2:$water_im = imagecreatefromjpeg($waterImage);break; 
case 3:$water_im = imagecreatefrompng($waterImage);break; 
default:die($formatMsg); 
} 
} 
//读取背景图片 
if(!emptyempty($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*5),0,”./cour.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( !emptyempty($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; 
case 2:imagejpeg($ground_im,$groundImage);break; 
case 3:imagepng($ground_im,$groundImage);break; 
default:die($errorMsg); 
} 
//释放内存 
if(isset($water_info)) unset($water_info); 
if(isset($water_im)) imagedestroy($water_im); 
unset($ground_info); 
imagedestroy($ground_im); 
} 
//————————————————————————————— 
$id=$_REQUEST['id']; 
$num = count($_FILES['userfile']['name']); 
print_r($_FILES['userfile']); 
print_r($_FILES['userfile']['name']); 
echo $num; 
echo “<bR>”; 
if(isset($id)){ 
for($i=0;$i<$id;$i++){ 
if(isset($_FILES) && !emptyempty($_FILES['userfile']) && $_FILES['userfile']['size']>0) 
{ 
$uploadfile = “./”.time().”_”.$_FILES['userfile'][name][$i]; 
echo “<br>”; 
echo $uploadfile; 
if (copy($_FILES['userfile']['tmp_name'][$i], $uploadfile)) 
{ 
echo “OK<br>”; 
//文字水印 
//imageWaterMark($uploadfile,5,”",”HTTP://www.lvye.info”,5,”#cccccc“); 
//图片水印 
$waterImage=”logo_ok1.gif”;//水印图片路径 
imageWaterMark($uploadfile,9,$waterImage); 
echo “<img src=”".$uploadfile.”” border=”0”>”; 
} 
else 
{ 
echo “Fail<br>”; 
} 
} 
} 
} 
?> 
<form enctype=”multipart/form-data” method=”POST”> 
<?php 
for($a=0;$a<$id;$a++){ 
echo “文件: <input name=”userfile[]” type=”file”><br>”; 
} 
?> 
<input type=”submit” value=”上传”> 
</form>

代码4
增加中文水印 
<?php 
/*------------------------------------------------------------- 
**描述:这是用于给指定图片加底部水印(不占用图片显示区域)的自定义类,需创建对象调用 
**创建:2007-10-09 
**更新:2007-10-09 
**说明:1、需要gd库支持,需要iconv支持(php5已经包含不用加载) 
2、只适合三种类型的图片,jpg/jpeg/gif/png,其它类型不处理 
3、注意图片所在目录的属性必须可写 
4、调用范例: 
$objImg = new MyWaterDownChinese(); 
$objImg->Path = "images/"; 
$objImg->FileName = "1.jpg"; 
$objImg->Text = "HAHAKONGJIAN[url]HTTP://HI.BAIDU.COM/LYSONCN[/url]"; 
$objImg->Font = "./font/simhei.ttf"; 
$objImg->Run(); 
**成员函数: 
----------------------------------------------------------------*/ 
class MyWaterDownChinese{ 
var $Path = "./"; //图片所在目录相对于调用此类的页面的相对路径 
var $FileName = ""; //图片的名字,如“1.jpg” 
var $Text = ""; //图片要加上的水印文字,支持中文 
var $TextColor = "#ffffff"; //文字的颜色,gif图片时,字体颜色只能为黑色 
var $TextBgColor = "#000000"; //文字的背景条的颜色 
var $Font = "c://windows//fonts//simhei.ttf"; //字体的存放目录,相对路径 
var $OverFlag = true; //是否要覆盖原图,默认为覆盖,不覆盖时,自动在原图文件名后+"_water_down",如“1.jpg”=> "1_water_down.jpg" 
var $BaseWidth = 200; //图片的宽度至少要>=200,才会加上水印文字。 
//------------------------------------------------------------------ 
//功能:类的构造函数(php5.0以上的形式) 
//参数:无 
//返回:无 
function __construct(){;} 
//------------------------------------------------------------------ 
//功能:类的析构函数(php5.0以上的形式) 
//参数:无 
//返回:无 
function __destruct(){;} 
//------------------------------------------------------------------ 
//------------------------------------ 
//功能:对象运行函数,给图片加上水印 
//参数:无 
//返回:无 
function Run() 
{ 
if($this->FileName == "" || $this->Text == "") 
return; 
//检测是否安装GD库 
if(false == function_exists("gd_info")) 
{ 
echo "系统没有安装GD库,不能给图片加水印."; 
return; 
} 
//设置输入、输出图片路径名 
$arr_in_name = explode(".",$this->FileName); 
// 
$inImg = $this->Path.$this->FileName; 
$outImg = $inImg; 
$tmpImg = $this->Path.$arr_in_name[0]."_tmp.".$arr_in_name[1]; //临时处理的图片,很重要 
if(!$this->OverFlag) 
$outImg = $this->Path.$arr_in_name[0]."_water_down.".$arr_in_name[1]; 
//检测图片是否存在 
if(!file_exists($inImg)) 
return ; 
//获得图片的属性 
$groundImageType = @getimagesize($inImg); 
$imgWidth = $groundImageType[0]; 
$imgHeight = $groundImageType[1]; 
$imgType = $groundImageType[2]; 
if($imgWidth < $this->BaseWidth) //小于基本宽度,不处理 
return; 
//图片不是jpg/jpeg/gif/png时,不处理 
switch($imgType) 
{ 
case 1: 
$image = imagecreatefromgif($inImg); 
$this->TextBgColor = "#ffffff"; //gif图片字体只能为黑,所以背景颜色就设置为白色 
break; 
case 2: 
$image = imagecreatefromjpeg($inImg); 
break; 
case 3: 
$image = imagecreatefrompng($inImg); 
break; 
default: 
return; 
break; 
} 
//创建颜色 
$color = @imagecolorallocate($image,hexdec(substr($this->TextColor,1,2)),hexdec(substr($this->TextColor,3,2)),hexdec(substr($this->TextColor,5,2))); //文字颜色 
//生成一个空的图片,它的高度在底部增加水印高度 
$newHeight = $imgHeight+20; 
$objTmpImg = @imagecreatetruecolor($imgWidth,$newHeight); 
$colorBg = @imagecolorallocate($objTmpImg,hexdec(substr($this->TextBgColor,1,2)),hexdec(substr($this->TextBgColor,3,2)),hexdec(substr($this->TextBgColor,5,2))); //背景颜色 
//填充图片的背景颜色 
@imagefill ($objTmpImg,0,0,$colorBg); 
//把原图copy到临时图片中 
@imagecopy($objTmpImg,$image,0,0,0,0,$imgWidth,$imgHeight); 
//创建要写入的水印文字对象 
$objText = $this->createText($this->Text); 
//计算要写入的水印文字的位置 
$x = 5; 
$y = $newHeight-5; 
//写入文字水印 
@imagettftext($objTmpImg,10,0,$x,$y,$color,$this->Font,$objText); 
//生成新的图片,临时图片 
switch($imgType) 
{ 
case 1: 
imagegif($objTmpImg,$tmpImg); 
break; 
case 2: 
imagejpeg($objTmpImg,$tmpImg); 
break; 
case 3: 
imagepng($objTmpImg,$tmpImg); 
break; 
default: 
return; 
break; 
} 
//释放资源 
@imagedestroy($objTmpImg); 
@imagedestroy($image); 
//重新命名文件 
if($this->OverFlag) 
{ 
//覆盖原图 
@unlink($inImg); 
@rename($tmpImg,$outImg); 
} 
else 
{ 
//不覆盖原图 
@rename($tmpImg,$outImg); 
} 
} 
//-------------------------------------- 
//功能:创建水印文字对象 
//参数:无 
//返回:创建的水印文字对象 
function createText($instring) 
{ 
$outstring=""; 
$max=strlen($instring); 
for($i=0;$i<$max;$i++) 
{ 
$h=ord($instring[$i]); 
if($h>=160 && $i<$max-1) 
{ 
$outstring .= "&#".base_convert(bin2hex(iconv("gb2312","ucs-2",substr($instring,$i,2))),16,10).";"; 
$i++; 
} 
else 
{ 
$outstring .= $instring[$i]; 
} 
} 
return $outstring; 
} 
}//class 
?>
PHP 相关文章推荐
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
php使用mkdir创建多级目录入门例子
May 10 PHP
php开启openssl的方法
May 15 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
Aug 12 PHP
PHP 获取 ping 时间的实现方法
Sep 29 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
php中防止恶意刷新页面的代码小结
Oct 31 #PHP
利用PHP生成静态HTML文档的原理
Oct 29 #PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 #PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 #PHP
php daddslashes()和 saddslashes()有哪些区别分析
Oct 26 #PHP
PHP daddslashes 使用方法介绍
Oct 26 #PHP
Zend Studio去除编辑器的语法警告设置方法
Oct 24 #PHP
You might like
PHP以及MYSQL日期比较方法
2012/11/29 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
jquery 获取json数据实现代码
2009/04/27 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
Python虚拟环境项目实例
2017/11/20 Python
python的unittest测试类代码实例
2017/12/07 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
播音主持女孩的自我评价分享
2013/11/20 职场文书
质检部职责
2013/12/28 职场文书
需求分析说明书
2014/05/09 职场文书
求职简历自荐信
2014/06/18 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
先进个人总结范文
2015/02/15 职场文书
致运动员的广播稿
2015/08/19 职场文书
开网店计划分析
2019/07/30 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android