支持以圖片和文字兩種方式給圖片添加水印。圖片支持GIF,PNG,JPG三種格式,水印圖片支持PNG和GIFphp
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($srcImg_w < $markImg_w || $srcImg_h < $markImg_h) { return; } switch ($markImgInfo[2]) { case 1: $markim =imagecreatefromgif($markImg); break; case 2: $markim =imagecreatefromjpeg($markImg); break; case 3: $markim =imagecreatefrompng($markImg); break; default: die("不支持的水印圖片文件類型"); exit; } $logow = $markImg_w; $logoh = $markImg_h; } if(!strcmp($markType,"text")) { $fontSize = 16; if(!empty($markText)) { if(!file_exists($fontType)) { return; } } else { return; } $box = @imagettfbbox($fontSize, 0, $fontType,$markText); $logow = max($box[2], $box[4]) - min($box[0], $box[6]); $logoh = max($box[1], $box[3]) - min($box[5], $box[7]); } if($markPos == 0) { $markPos = rand(1, 9); } switch($markPos) { case 1: $x = +5; $y = +5; break; case 2: $x = ($srcImg_w - $logow) / 2; $y = +5; break; case 3: $x = $srcImg_w - $logow - 5; $y = +15; break; case 4: $x = +5; $y = ($srcImg_h - $logoh) / 2; break; case 5: $x = ($srcImg_w - $logow) / 2; $y = ($srcImg_h - $logoh) / 2; break; case 6: $x = $srcImg_w - $logow - 5; $y = ($srcImg_h - $logoh) / 2; break; case 7: $x = +5; $y = $srcImg_h - $logoh - 5; break; case 8: $x = ($srcImg_w - $logow) / 2; $y = $srcImg_h - $logoh - 5; break; case 9: $x = $srcImg_w - $logow - 5; $y = $srcImg_h - $logoh -5; break; default: die("此位置不支持"); exit; } $dst_img = @imagecreatetruecolor($srcImg_w, $srcImg_h); imagecopy ( $dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h); if(!strcmp($markType,"img")) { imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh); imagedestroy($markim); } if(!strcmp($markType,"text")) { $rgb = explode(',', $TextColor); $color = imagecolorallocate($dst_img, $rgb[0], $rgb[1], $rgb[2]); imagettftext($dst_img, $fontSize, 0, $x, $y, $color, $fontType,$markText); } // www.jbxue.com switch ($srcInfo[2]) { case 1: imagegif($dst_img, $imgSrc); break; case 2: imagejpeg($dst_img, $imgSrc); break; case 3: imagepng($dst_img, $imgSrc); break; default: die("不支持的水印圖片文件類型"); exit; } imagedestroy($dst_img); imagedestroy($srcim); }
參數說明:
數組
$imgSrc:目標圖片,可帶相對目錄地址,
函數
$markImg:水印圖片,可帶相對目錄地址,支持PNG和GIF兩種格式,如水印圖片在執行文件mark目錄下,可寫成:mark/mark.gif測試
$markText:給圖片添加的水印文字字體
$TextColor:水印文字的字體顏色網站
$markPos:圖片水印添加的位置,取值範圍:0~9spa
0:隨機位置,在1~8之間隨機選取一個位置code
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函數也能夠設置合成的圖片質量。