PHP實現(xiàn)圖片加水印功能
這里分享下php給圖片加水印的幾個自定義函數(shù)
給圖片加水印首先需要開啟GD庫。
用到的php函數(shù)是imagecopymerge () 和 imagecopy ()
imagecopymerge 函數(shù)可以支持兩個圖像疊加時,設(shè)置疊加的透明度
imagecopy 函數(shù)則不支持疊加透明。
基本概念就啰嗦到這,下邊是幾個函數(shù)的講解
在圖像上打上LOGO水印。
logo透明的png圖像,logo.png ,
使用imagecopymerge函數(shù),可以實現(xiàn)打上透明度為30%的水印圖標
(可是當我的圖片是jpeg,而我的水印圖片是png時,水印圖片原來透明的背景,變得一片黑灰,背景不透明了,我不知道這個問題是不是只有我自己遇見過)
使用imagecopy函數(shù),可以保留logo本身的透明信息,但無法實現(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:原文件圖像對象建立失敗 ?*??????????-4:水印文件圖像對象建立失敗?-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);//取得圖片信息,是一個數(shù)組,第一個值是寬,第二個值是高(因此水印圖片的寬高我們是可以限制的) ????if?(!$srcinfo)?{ ????????return?-1;?//原文件不存在 ????} ????$waterinfo?=?@getimagesize($waterImg); ????if?(!$waterinfo)?{ ????????return?-2;?//水印圖片不存在 ????} ????$srcImgObj?=?image_create_from_ext($srcImg); ????if?(!$srcImgObj)?{ ????????return?-3;?//原文件圖像對象建立失敗 ????} ????$waterImgObj?=?image_create_from_ext($waterImg); ????if?(!$waterImgObj)?{ ????????return?-4;?//水印文件圖像對象建立失敗 ????} ????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)建一個新圖象 */ 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; } ? /** ?*?將背景透明的陪你過圖片與背景不透明的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); ????//?計算透明度 ????//?$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ù)的備注里邊有介紹。對應其位置就好
但是,這個也是有問題的,測試的時候,發(fā)現(xiàn),當水印圖片是png文件,被加水印的圖片也是png圖片時,就會出現(xiàn)水印圖片原來透明的背景,變得一片黑灰,背景不透明了。
這個問題,暫時還沒有想到解決的辦法,使用的時候,注意一下這個問題。
請注意:水印功能需要用到GD庫,請檢查下php是否開啟了GD庫擴展。
到此這篇關(guān)于PHP實現(xiàn)圖片加水印功能的文章就介紹到這了,更多相關(guān)PHP圖片加水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP?trim函數(shù)對多字節(jié)字符的使用限制實例探究
這篇文章主要為大家介紹了PHP?trim函數(shù)對多字節(jié)字符的使用限制實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01