仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 926|回复: 19
打印 上一主题 下一主题

[学习教程] PHP编程:PHP图片水印函数:撑持以图片和文字体例...

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:36:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
要想从事软件开发工作,那么,还有很多的知识要学习,其实,不管是以后想去从事哪个工作,都需要自己去利用空闲的时间去不断的学习新的知识,不断的充实自己。     明天是六一儿童节,嘿嘿,和人人分享下在PHP网站开辟中常常用到的给图片添加水印的函数源码,由David编写,亲身测试经由过程,撑持以图片和文字两种体例给图片添加水印。图片撑持GIF,PNG,JPG三种格局,水印图片撑持PNG和GIF。闲话少说,贴出我的PHP图片水印函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
function setWater($imgSrc,$markImg,$markText,$TextColor,$markPos,$fontType,$markType)
{

     $srcInfo = @getimagesize($imgSrc);
     $srcImg_w    = $srcInfo[0];
     $srcImg_h    = $srcInfo[1];
         
     switch ($srcInfo[2])
     {
         case 1:
             $srcim =imagecreatefromgif($imgSrc);
             break;
         case 2:
             $srcim =imagecreatefromjpeg($imgSrc);
             break;
         case 3:
             $srcim =imagecreatefrompng($imgSrc);
             break;
         default:
             die("不撑持的图片文件类型");
             exit;
     }
         
     if(!strcmp($markType,"img"))
     {
         if(!file_exists($markImg) empty($markImg))
         {
             return;
         }
            
         $markImgInfo = @getimagesize($markImg);
         $markImg_w    = $markImgInfo[0];
         $markImg_h    = $markImgInfo[1];
            
         if&#40;$srcImg_w < $markImg_w $srcImg_h < $markImg_h&#41;
         {
             return;
         }
            
         switch &#40;$markImgInfo&#91;2&#93;&#41;
         {
             case 1:
                 $markim =imagecreatefromgif&#40;$markImg&#41;;
                 break;
             case 2:
                 $markim =imagecreatefromjpeg&#40;$markImg&#41;;
                 break;
             case 3:
                 $markim =imagecreatefrompng&#40;$markImg&#41;;
                 break;
             default:
                 die&#40;"不撑持的水印图片文件类型"&#41;;
                 exit;
         }
            
         $logow = $markImg_w;
         $logoh = $markImg_h;
     }
         
     if&#40;!strcmp&#40;$markType,"text"&#41;&#41;
     {
         $fontSize = 16;
         if&#40;!empty&#40;$markText&#41;&#41;
         {
             if&#40;!file_exists&#40;$fontType&#41;&#41;
             {
                 return;
             }
         }
         else {
             return;
         }
            
         $box = @imagettfbbox&#40;$fontSize, 0, $fontType,$markText&#41;;
         $logow = max&#40;$box&#91;2&#93;, $box&#91;4&#93;&#41; - min&#40;$box&#91;0&#93;, $box&#91;6&#93;&#41;;
         $logoh = max&#40;$box&#91;1&#93;, $box&#91;3&#93;&#41; - min&#40;$box&#91;5&#93;, $box&#91;7&#93;&#41;;
     }
         
     if&#40;$markPos == 0&#41;
     {
         $markPos = rand&#40;1, 9&#41;;
     }
         
     switch&#40;$markPos&#41;
     {
         case 1:
             $x = +5;
             $y = +5;
             break;
         case 2:
             $x = &#40;$srcImg_w - $logow&#41; / 2;
             $y = +5;
             break;
         case 3:
             $x = $srcImg_w - $logow - 5;
             $y = +15;
             break;
         case 4:
             $x = +5;
             $y = &#40;$srcImg_h - $logoh&#41; / 2;
             break;
         case 5:
             $x = &#40;$srcImg_w - $logow&#41; / 2;
             $y = &#40;$srcImg_h - $logoh&#41; / 2;
             break;
         case 6:
             $x = $srcImg_w - $logow - 5;
             $y = &#40;$srcImg_h - $logoh&#41; / 2;
             break;
         case 7:
             $x = +5;
             $y = $srcImg_h - $logoh - 5;
             break;
         case 8:
             $x = &#40;$srcImg_w - $logow&#41; / 2;
             $y = $srcImg_h - $logoh - 5;
             break;
         case 9:
             $x = $srcImg_w - $logow - 5;
             $y = $srcImg_h - $logoh -5;
             break;
         default:
             die&#40;"此地位不撑持"&#41;;
             exit;
     }
         
     $dst_img = @imagecreatetruecolor&#40;$srcImg_w, $srcImg_h&#41;;
         
     imagecopy &#40; $dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h&#41;;
         
     if&#40;!strcmp&#40;$markType,"img"&#41;&#41;
     {
         imagecopy&#40;$dst_img, $markim, $x, $y, 0, 0, $logow, $logoh&#41;;
         imagedestroy&#40;$markim&#41;;
     }
         
     if&#40;!strcmp&#40;$markType,"text"&#41;&#41;
     {
         $rgb = explode&#40;',', $TextColor&#41;;
            
         $color = imagecolorallocate&#40;$dst_img, $rgb&#91;0&#93;, $rgb&#91;1&#93;, $rgb&#91;2&#93;&#41;;
         imagettftext&#40;$dst_img, $fontSize, 0, $x, $y, $color, $fontType,$markText&#41;;
     }
         
     switch &#40;$srcInfo&#91;2&#93;&#41;
     {
         case 1:
             imagegif&#40;$dst_img, $imgSrc&#41;;
             break;
         case 2:
             imagejpeg&#40;$dst_img, $imgSrc&#41;;
             break;
         case 3:
             imagepng&#40;$dst_img, $imgSrc&#41;;
             break;
         default:
             die&#40;"不撑持的水印图片文件类型"&#41;;
             exit;
     }
         
     imagedestroy&#40;$dst_img&#41;;
     imagedestroy&#40;$srcim&#41;;
} 参数申明
$imgSrc:方针图片,可带绝对目次地址,
$markImg:水印图片,可带绝对目次地址,撑持PNG和GIF两种格局,如水印图片在履行文件mark目次下,可写成:mark/mark.gif
$markText:给图片添加的水印文字
$TextColor:水印文字的字体色彩
$markPos:图片水印添加的地位,取值局限:0~9
0:随机地位,在1~8之间随机拔取一个地位
1:顶部居左 2:顶部居中 3:顶部居右 4:右边居中
5:图片中间 6:右侧居中 7:底部居左 8:底部居中 9:底部居右
$fontType:详细的字体库,可带绝对目次地址
$markType:图片添加水印的体例,img代表以图片体例,text代表以文字体例添加水印
代码正文
第4~6行:获得方针图片的宽度和高度
第8~22行:依据图片类型挪用分歧的函数,取得操作图象标识符
GetImageSize函数常识点:GetImageSize不需求装置 GD度便可利用,其前往值数组有四个元素。索引值0是图片高度。索引值1是图片的宽度。索引值2是图片的文件格局,其值1为GIF格局、2为JPEG/JPG格局、3为PNG格局。索引值3为图片的高与宽字符串,height=xxx width=yyy。前往的图片宽度和高度单元都是像素(pixel)
第24~58行:中选择图片体例给方针图片添加水印时,获得水印图片的宽度和高度,凡是情形都是网站的logo。假如方针图片比水印图片宽度或高度小或水印图片不存在,则跳出这个函数。
return语句常识点:直接return 暗示甚么都不前往,直接停止这个函数。也能够了解成前往 NULL。
第60~77行:中选择文字体例给方针图片添加水印时,起首设定水印文字的巨细,默许我设置为16px,你可以依据需求自行调剂字体巨细。假如字体文件不存在,跳出函数,最初经由过程imagettfbbox函数取得此设定格局的文字的虚拟长宽。
imagettfbbox函数常识点:此函数前往一个含有8个单位的数组暗示文本外框的四个角,索引值寄义:0代表左下角 X 地位,1代表坐下角 Y 地位,2代表右下角 X 地位,3代表右下角 Y 地位,4代表右上角 X 地位,5代表右上角 Y 地位,6代表左上角 X 地位,7代表左上角 Y 地位。此函数同时需求GD 库和FreeType库的撑持
max函数前往参数中数值最大的值。
第79~125行:依据设定的图片水印地位盘算详细坐标值,你可以依据后果详细细化水印的地位。
第127~129行:新建一个和方针图片巨细分歧的图片。
:因为imagecreatetruecolor函数局限的是一个黑色图片,所以假如你的方针图片是通明的,则生成的新图将不会是通明色。
第131~162行:依据图片或文字体例,终究生成添加了水印的图片。
挪用申明
以函数挪用体例挪用便可,固然你也能够以类的体例封装,或你也能够依据需求将此函数进一步细分模块也能够。固然你如今如许用也是没有任何成绩的,我已测试过,请宁神利用。
其他申明
因为imagettftext和imagettfbbox函数需求GD库和FreeType库的撑持,假如你的运转情况不撑持GD库和FreeType库则文字体例就没法完成,你可以用imagestring函数完成给图片添加文字水印,同时设定下text体例下的$logow和$logoh值便可。
imagejpeg函数也能够设置分解的图片质量。
PHP图片加水印函数思绪总结
起首盘算方针图片、水印图片和文字的宽度和高度,在依据详细地位盘算终究水印呈现的地位信息,即X和Y值。最初分解图片,新的图片就添加了水印。
:PHP网站开辟教程-leapsoul.cn版权一切,转载时请以链接模式注明原始出处及本声明,感谢。
HTML中的任何元素都要亲自实践,只有明白了什么元素会起到什么效果之后,你才会记忆深刻,而一味的啃书,绝对是不行的,我想大部分新手之所以觉得概念难学,大部分是一个字“懒”,懒是阻止进步的最大敌人,所以克服掉懒的习惯,才能更快的学好一样东西。
若相依 该用户已被删除
沙发
发表于 2015-2-9 13:51:23 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
爱飞 该用户已被删除
板凳
发表于 2015-2-12 05:50:44 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
再现理想 该用户已被删除
地板
发表于 2015-2-14 06:26:41 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
admin 该用户已被删除
5#
发表于 2015-3-4 05:01:31 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
冷月葬花魂 该用户已被删除
6#
发表于 2015-3-11 17:16:00 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
简单生活 该用户已被删除
7#
发表于 2015-3-17 04:12:16 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
第二个灵魂 该用户已被删除
8#
发表于 2015-3-23 19:00:52 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
海妖 该用户已被删除
9#
发表于 2015-3-24 10:50:01 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
精灵巫婆 该用户已被删除
10#
发表于 2015-3-29 19:05:14 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
小女巫 该用户已被删除
11#
发表于 2015-4-3 02:45:05 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
分手快乐 该用户已被删除
12#
发表于 2015-4-4 10:20:00 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
兰色精灵 该用户已被删除
13#
发表于 2015-4-5 12:16:14 | 只看该作者
爱上php,他也会爱上你。
若天明 该用户已被删除
14#
发表于 2015-4-13 00:38:23 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
小魔女 该用户已被删除
15#
发表于 2015-4-14 18:47:46 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
愤怒的大鸟 该用户已被删除
16#
发表于 2015-4-16 17:12:16 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
乐观 该用户已被删除
17#
发表于 2015-4-17 14:15:20 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
只想知道 该用户已被删除
18#
发表于 2015-4-20 00:09:01 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
老尸 该用户已被删除
19#
发表于 2015-6-12 19:21:23 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
飘灵儿 该用户已被删除
20#
发表于 2015-6-17 12:23:18 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 02:59

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表