PHP實(shí)現(xiàn)圖片加水印功能
這里分享下php給圖片加水印的幾個(gè)自定義函數(shù)
給圖片加水印首先需要開(kāi)啟GD庫(kù)。
用到的php函數(shù)是imagecopymerge () 和 imagecopy ()
imagecopymerge 函數(shù)可以支持兩個(gè)圖像疊加時(shí),設(shè)置疊加的透明度
imagecopy 函數(shù)則不支持疊加透明。
基本概念就啰嗦到這,下邊是幾個(gè)函數(shù)的講解
在圖像上打上LOGO水印。
logo透明的png圖像,logo.png ,
使用imagecopymerge函數(shù),可以實(shí)現(xiàn)打上透明度為30%的水印圖標(biāo)
(可是當(dāng)我的圖片是jpeg,而我的水印圖片是png時(shí),水印圖片原來(lái)透明的背景,變得一片黑灰,背景不透明了,我不知道這個(gè)問(wèn)題是不是只有我自己遇見(jiàn)過(guò))
使用imagecopy函數(shù),可以保留logo本身的透明信息,但無(wú)法實(shí)現(xiàn)透明度30%的水印疊加
我的解決方式是這樣
先用imagecopy()函數(shù)生成水印,將水印放到生成的空白圖像上
再用imagecopymerge()再將要加水印的圖片與其合成一張圖片,為其設(shè)置透明度
不啰嗦了,直接上函數(shù)。
/** ?*?圖片加水?。ㄟm用于png/jpg/gif格式) * @author camellia *?@param?$srcImg?原圖片 ?*?@param?$waterImg?水印圖片 ?*?@param?$savepath?保存路徑 ?*?@param?$savename?保存名字 ?*?@param?$positon?水印位置 ?*?1:頂部居左,?2:頂部居右,?3:居中,?4:底部局左,?5:底部居右 ?*?@param?$alpha?透明度?--?0:完全透明,?100:完全不透明 ?*?@return?成功?--?加水印后的新圖片地址 ?*??????????失敗?--?-1:原文件不存在,?-2:水印圖片不存在,?-3:原文件圖像對(duì)象建立失敗 ?*??????????-4:水印文件圖像對(duì)象建立失敗?-5:加水印后的新圖片保存失敗 ?*/ function?img_water_mark($srcImg,?$waterImg,?$savepath=null,?$savename=null,?$positon=5,?$alpha=50) { ????$temp?=?pathinfo($srcImg); ????$name?=?$temp['basename']; ????$path?=?$temp['dirname']; ????$exte?=?$temp['extension']; ????$savename?=?$savename???$savename?:?$name; ????$savepath?=?$savepath???$savepath?:?$path; ????$savefile?=?$savepath?.'/'.?$savename; ????$srcinfo?=?@getimagesize($srcImg);//取得圖片信息,是一個(gè)數(shù)組,第一個(gè)值是寬,第二個(gè)值是高(因此水印圖片的寬高我們是可以限制的) ????if?(!$srcinfo)?{ ????????return?-1;?//原文件不存在 ????} ????$waterinfo?=?@getimagesize($waterImg); ????if?(!$waterinfo)?{ ????????return?-2;?//水印圖片不存在 ????} ????$srcImgObj?=?image_create_from_ext($srcImg); ????if?(!$srcImgObj)?{ ????????return?-3;?//原文件圖像對(duì)象建立失敗 ????} ????$waterImgObj?=?image_create_from_ext($waterImg); ????if?(!$waterImgObj)?{ ????????return?-4;?//水印文件圖像對(duì)象建立失敗 ????} ????switch?($positon)?{ ????????//1頂部居左 ????????case?1:?$x=$y=0;?break; ????????//2頂部居右 ????????case?2:?$x?=?$srcinfo[0]-$waterinfo[0];?$y?=?0;?break; ????????//3居中 ????????case?3:?$x?=?($srcinfo[0]-$waterinfo[0])/2;?$y?=?($srcinfo[1]-$waterinfo[1])/2;?break; ????????//4底部居左 ????????case?4:?$x?=?0;?$y?=?$srcinfo[1]-$waterinfo[1];?break; ????????//5底部居右 ????????case?5:?$x?=?$srcinfo[0]-$waterinfo[0];?$y?=?$srcinfo[1]-$waterinfo[1];?break; ????????default:?$x=$y=0; ????} ????imagecopymerge_gc($srcImgObj,?$waterImgObj,?$x,?$y,?0,?0,?$waterinfo[0],?$waterinfo[1],?$alpha); ????//?imagecopymerge($srcImgObj,?$waterImgObj,?$x,?$y,?0,?0,?$waterinfo[0],?$waterinfo[1],?$alpha); ????//?imagecopy($srcImgObj,?$waterImgObj,?$x,?$y,?0,?0,?$waterinfo[0],?$waterinfo[1]); ????switch?($srcinfo[2])?{ ????????case?1:?imagegif($srcImgObj,?$savefile);?break; ????????case?2:?imagejpeg($srcImgObj,?$savefile);?break; ????????case?3:?imagepng($srcImgObj,?$savefile);?break; ????????default:?return?-5;?//保存失敗 ????} ????imagedestroy($srcImgObj); ????imagedestroy($waterImgObj); ????return?$savefile; } ? /** ?*?由文件或?URL?創(chuàng)建一個(gè)新圖象 */ function?image_create_from_ext($imgfile) { ????$info?=?getimagesize($imgfile); ????$im?=?null; ????switch?($info[2])?{ ????????case?1:?$im=imagecreatefromgif($imgfile);?break; ????????case?2:?$im=imagecreatefromjpeg($imgfile);?break; ????????case?3:?$im=imagecreatefrompng($imgfile);?break; ????} ????return?$im; } ? /** ?*?將背景透明的陪你過(guò)圖片與背景不透明的jpg圖片合成一張 ?*?并保持png圖片背景透明 */ function?imagecopymerge_gc($dst_im,?$src_im,?$dst_x,?$dst_y,?$src_x,?$src_y,?$src_w,?$src_h,?$pct){ ????//?透明度 ????$opacity?=?$pct; ????//?獲取水印圖片寬 ????$w?=?imagesx($src_im); ????//?獲取水印圖片高 ????$h?=?imagesy($src_im); ????//?函數(shù)用于創(chuàng)建一幅空白圖像 ????$cut?=?imagecreatetruecolor($src_w,?$src_h); ????//??拷貝圖像的一部分 ????imagecopy($cut,?$dst_im,?0,?0,?$dst_x,?$dst_y,?$src_w,?$src_h); ????//?計(jì)算透明度 ????//?$opacity?=?100?-?$opacity; ????//?生成水印,將水印放到生成的空白圖像上 ????imagecopy($cut,?$src_im,?0,?0,?$src_x,?$src_y,?$src_w,?$src_h); ????//?再將要加水印的圖片與其合成一張圖片,為其設(shè)置透明度 ????imagecopymerge($dst_im,?$cut,?$dst_x,?$dst_y,?$src_x,?$src_y,?$src_w,?$src_h,?$opacity); } /** ?*?============================??我是分隔符??============================== ?*/
注:調(diào)用方法
img_water_mark(‘要加水印圖片' , ‘水印圖片' , ‘保存路徑');
其他參數(shù)函數(shù)的備注里邊有介紹。對(duì)應(yīng)其位置就好
但是,這個(gè)也是有問(wèn)題的,測(cè)試的時(shí)候,發(fā)現(xiàn),當(dāng)水印圖片是png文件,被加水印的圖片也是png圖片時(shí),就會(huì)出現(xiàn)水印圖片原來(lái)透明的背景,變得一片黑灰,背景不透明了。
這個(gè)問(wèn)題,暫時(shí)還沒(méi)有想到解決的辦法,使用的時(shí)候,注意一下這個(gè)問(wèn)題。
請(qǐng)注意:水印功能需要用到GD庫(kù),請(qǐng)檢查下php是否開(kāi)啟了GD庫(kù)擴(kuò)展。
到此這篇關(guān)于PHP實(shí)現(xiàn)圖片加水印功能的文章就介紹到這了,更多相關(guān)PHP圖片加水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP接口繼承及接口多繼承原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了PHP接口繼承及接口多繼承原理與實(shí)現(xiàn)方法,簡(jiǎn)單描述了接口繼承與多接口繼承的概念、原理,并結(jié)合實(shí)例形式給出了php接口繼承的具體實(shí)現(xiàn)與使用等操作技巧,需要的朋友可以參考下2017-10-10PHP?trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究
這篇文章主要為大家介紹了PHP?trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01flash用php連接數(shù)據(jù)庫(kù)的代碼
flash用php連接數(shù)據(jù)庫(kù)的代碼,需要的朋友可以參考下。2011-04-04php實(shí)現(xiàn)的RSS生成類實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的RSS生成類,實(shí)例分析了RSS生成類的原理、定義與使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04比較簡(jiǎn)單實(shí)用的PHP無(wú)限分類源碼分享(思路不錯(cuò))
關(guān)于PHP的無(wú)限分類代碼,網(wǎng)上已經(jīng)有很多了,講解的也很到位,在這里我分享一下我用著很順手的一個(gè)2011-10-10PHP操作Postgresql封裝類與應(yīng)用完整實(shí)例
這篇文章主要介紹了PHP操作Postgresql封裝類,結(jié)合實(shí)例形式分析了php針對(duì)Postgresql數(shù)據(jù)庫(kù)常見(jiàn)的連接、查詢、統(tǒng)計(jì)等操作封裝技巧與使用方法,需要的朋友可以參考下2018-04-04