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 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
Aug 28 PHP
PHP截取指定图片大小的方法
Dec 10 PHP
php curl登陆qq后获取用户信息时证书错误
Feb 03 PHP
php析构函数的简单使用说明
Aug 24 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
PHP PDOStatement::nextRowset讲解
Feb 01 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
Mar 18 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
FCKeditor添加自定义按钮
2008/03/27 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
Python常用断言函数实例汇总
2020/11/30 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
开服装店计划书
2014/08/15 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
机关作风建设整改方案
2014/10/27 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
Python函数式编程中itertools模块详解
2021/09/15 Python