掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
相信既然你看到了這個(gè)文章,而且有興趣看下去,就說明你已經(jīng)知道了水印是什么,當(dāng)然如果你不知道但依然保持學(xué)習(xí)的熱情,我這里就廢話一句:水印其實(shí)就是為了保護(hù)我們的版權(quán),讓其他的人看到后認(rèn)為該圖片是我們的,打上我們的印記。大家都知道很多開源的程序都有類似的功能,或者可以借助第三方的插件完成,其實(shí)如果自己寫一個(gè)實(shí)現(xiàn)水印的class也不是太難。
大家也知道Discuz核心程序部分就有了這個(gè)處理水印的class,而且這個(gè)class是比較完善的,比如可以中英文文字水印、圖片水印等等,而且還可以在后臺直接操作大概的水印位置。大家如果有過設(shè)置經(jīng)驗(yàn)的就知道默認(rèn)可以設(shè)置9個(gè)位置的水印,分別是中間位置、四個(gè)角、四條邊的中點(diǎn)。當(dāng)然,而且DZ這個(gè)類支持門戶文章、論壇帖子、空間相冊分別設(shè)置。如下圖所示:
那么這個(gè)時(shí)候問題來了,很多朋友可能有上面這些可供我們選擇的還不夠。比如說我們很多人會選擇#9(也就是右下角),這是很多網(wǎng)站打水印用到的地方。但很多朋友會發(fā)現(xiàn)這個(gè)位置頂著右下角,只有幾px的距離(如頂端的圖片所示),有朋友可能想讓它離邊角更遠(yuǎn)一些,比如設(shè)置到距離離邊線20px以上距離。那么這其實(shí)存在一個(gè)很糾結(jié)的問題,我相信dz開發(fā)團(tuán)隊(duì)也考慮過,那是什么問題呢?
1、既然有人可能需要考慮任意位置,那么為什么在寫這個(gè)水印處理的類的時(shí)候?yàn)槭裁床粚懗赡欠N可能直接讓用戶填寫坐標(biāo)的方式,而寫成這種死板的方式呢?
2、就給出上面1的答案,我覺得肯定是他們考慮到大多數(shù)用戶只需要基本的功能,而且只需要在后臺簡單設(shè)置就可以完成,而且這個(gè)設(shè)置看上去很通俗。大家可以想一下,如果是一個(gè)小白站長,現(xiàn)在這樣的設(shè)置他一看就知道是什么意思,而如果要他填寫坐標(biāo),那也許他會找不到北。
3、因此就寫出了這種形式的類,讓那些愛折騰的人就自己折騰去吧,于是就有了這篇文章類似的文章。
前面說了控制這個(gè)水印位置的肯定是DZ核心程序的某個(gè)類庫里面的,那么問題的關(guān)鍵就是找到這個(gè)類庫在哪個(gè)文件里面。這有兩個(gè)方法去找到:
1、通過查詢開發(fā)手冊的文件索引表,查找到處理圖片的類,然后找到處理水印的函數(shù)(也就是這個(gè)類的一個(gè)方法之一)。
2、通過后臺設(shè)置區(qū)域?qū)彶樵乜吹疥P(guān)鍵詞(因?yàn)楹芏鄷r(shí)候用詞都是統(tǒng)一的),結(jié)果可以找到關(guān)鍵詞watermarkstatus,而通過檢索全站文件就會發(fā)現(xiàn)很多包含這個(gè)詞的文件,當(dāng)然我們只需要找類文件了,其他的就不用看了。
通過以上兩種方法我們都可以找到source/class/calss_image.php這個(gè)文件,其實(shí)這個(gè)文件全部部分就是一個(gè)PHP類,而類名就是image,在這個(gè)image類下有很多函數(shù)(方法)。在400行左右我們就可以找到我們的目標(biāo)——水印處理方法Watermark_GD()。實(shí)際上跟水印相關(guān)的不止這個(gè)方法,而這個(gè)方法只是設(shè)置水印位置的,也就是跟我們現(xiàn)在說的目標(biāo)有關(guān)的,除此之外還有它下面的Watermark_IM()等。
找到了這個(gè)類的這個(gè)方法那好說了,我們可以通過插件來調(diào)整具體的位置,甚至我們也可以把這個(gè)方法改寫成在后臺設(shè)置坐標(biāo)的形式(當(dāng)然需要我們另外設(shè)計(jì)一個(gè)我們插件用的數(shù)據(jù)表,因?yàn)槲覀冏霾寮豢赡苤苯有薷腄Z默認(rèn)的數(shù)據(jù)結(jié)構(gòu),那樣太不規(guī)范了,除此之外還要調(diào)整后臺),當(dāng)然這種方式是比較高階的了,需要用戶有基本的PHP基礎(chǔ)了。
而下面就介紹一個(gè)簡單的,誰都能看得懂的,而且因?yàn)樗∥恢孟鄬潭ǎ恍枰?jīng)常去調(diào)整,因此對于很多不懂PHP的朋友來說下面是最好不過的方式了。那就是找到Watermark_GD的坐標(biāo)設(shè)置部分代碼(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”就是離邊的距離了,如果需要變?yōu)?5就把5改成25即可,當(dāng)然其中的1-9就是后臺的9個(gè)位置,比如最后沒的9就是指右下角的那個(gè)。其實(shí)這部分就是一個(gè)Switch塊。修改后的效果就如下圖所示
當(dāng)然,就如前面所說的,這里擺出代碼說的這種是最基本的修改方案,如果還需要繼續(xù)進(jìn)一步修改就用DZ提供的API寫插件自定義,因?yàn)槠鋵?shí)這種修改DZ自帶類的方式是不太規(guī)范的,比如程序升級后所做的修改就被覆蓋了等等。當(dāng)然即使這種最簡單的,我相信依然有很多朋友需要!
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流