扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
相信既然你看到了这个文章,而且有兴趣看下去,就说明你已经知道了水印是什么,当然如果你不知道但依然保持学习的热情,我这里就废话一句:水印其实就是为了保护我们的版权,让其他的人看到后认为该图片是我们的,打上我们的印记。大家都知道很多开源的程序都有类似的功能,或者可以借助第三方的插件完成,其实如果自己写一个实现水印的class也不是太难。
大家也知道Discuz核心程序部分就有了这个处理水印的class,而且这个class是比较完善的,比如可以中英文文字水印、图片水印等等,而且还可以在后台直接操作大概的水印位置。大家如果有过设置经验的就知道默认可以设置9个位置的水印,分别是中间位置、四个角、四条边的中点。当然,而且DZ这个类支持门户文章、论坛帖子、空间相册分别设置。如下图所示:
那么这个时候问题来了,很多朋友可能有上面这些可供我们选择的还不够。比如说我们很多人会选择#9(也就是右下角),这是很多网站打水印用到的地方。但很多朋友会发现这个位置顶着右下角,只有几px的距离(如顶端的图片所示),有朋友可能想让它离边角更远一些,比如设置到距离离边线20px以上距离。那么这其实存在一个很纠结的问题,我相信dz开发团队也考虑过,那是什么问题呢?
1、既然有人可能需要考虑任意位置,那么为什么在写这个水印处理的类的时候为什么不写成那种可能直接让用户填写坐标的方式,而写成这种死板的方式呢?
2、就给出上面1的答案,我觉得肯定是他们考虑到大多数用户只需要基本的功能,而且只需要在后台简单设置就可以完成,而且这个设置看上去很通俗。大家可以想一下,如果是一个小白站长,现在这样的设置他一看就知道是什么意思,而如果要他填写坐标,那也许他会找不到北。
3、因此就写出了这种形式的类,让那些爱折腾的人就自己折腾去吧,于是就有了这篇文章类似的文章。
前面说了控制这个水印位置的肯定是DZ核心程序的某个类库里面的,那么问题的关键就是找到这个类库在哪个文件里面。这有两个方法去找到:
1、通过查询开发手册的文件索引表,查找到处理图片的类,然后找到处理水印的函数(也就是这个类的一个方法之一)。
2、通过后台设置区域审查元素看到关键词(因为很多时候用词都是统一的),结果可以找到关键词watermarkstatus,而通过检索全站文件就会发现很多包含这个词的文件,当然我们只需要找类文件了,其他的就不用看了。
通过以上两种方法我们都可以找到source/class/calss_image.php这个文件,其实这个文件全部部分就是一个PHP类,而类名就是image,在这个image类下有很多函数(方法)。在400行左右我们就可以找到我们的目标——水印处理方法Watermark_GD()。实际上跟水印相关的不止这个方法,而这个方法只是设置水印位置的,也就是跟我们现在说的目标有关的,除此之外还有它下面的Watermark_IM()等。
找到了这个类的这个方法那好说了,我们可以通过插件来调整具体的位置,甚至我们也可以把这个方法改写成在后台设置坐标的形式(当然需要我们另外设计一个我们插件用的数据表,因为我们做插件不可能直接修改DZ默认的数据结构,那样太不规范了,除此之外还要调整后台),当然这种方式是比较高阶的了,需要用户有基本的PHP基础了。
而下面就介绍一个简单的,谁都能看得懂的,而且因为水印位置相对固定,不需要经常去调整,因此对于很多不懂PHP的朋友来说下面是最好不过的方式了。那就是找到Watermark_GD的坐标设置部分代码(419-456行)
[cc lang="php"]
switch($this->param['watermarkstatus'][$type]) {
case 1:
$x = 5;
$y = 5;
break;
case 2:
$x = ($this->imginfo['width'] – $logo_w) / 2;
$y = 5;
break;
case 3:
$x = $this->imginfo['width'] – $logo_w – 5;
$y = 5;
break;
case 4:
$x = 5;
$y = ($this->imginfo['height'] – $logo_h) / 2;
break;
case 5:
$x = ($this->imginfo['width'] – $logo_w) / 2;
$y = ($this->imginfo['height'] – $logo_h) / 2;
break;
case 6:
$x = $this->imginfo['width'] – $logo_w;
$y = ($this->imginfo['height'] – $logo_h) / 2;
break;
case 7:
$x = 5;
$y = $this->imginfo['height'] – $logo_h – 5;
break;
case 8:
$x = ($this->imginfo['width'] – $logo_w) / 2;
$y = $this->imginfo['height'] – $logo_h – 5;
break;
case 9:
$x = $this->imginfo['width'] – $logo_w – 5;
$y = $this->imginfo['height'] – $logo_h – 5;
break;
}
[/cc]
如上面的“5”就是离边的距离了,如果需要变为25就把5改成25即可,当然其中的1-9就是后台的9个位置,比如最后没的9就是指右下角的那个。其实这部分就是一个Switch块。修改后的效果就如下图所示
当然,就如前面所说的,这里摆出代码说的这种是最基本的修改方案,如果还需要继续进一步修改就用DZ提供的API写插件自定义,因为其实这种修改DZ自带类的方式是不太规范的,比如程序升级后所做的修改就被覆盖了等等。当然即使这种最简单的,我相信依然有很多朋友需要!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流