php 給圖片新增文字水印 可控制位置,旋轉,多行文字
阿新 • • 發佈:2020-07-13
<?php /** * Text Watermark Point: * #1 #2 #3 * #4 #5 #6 * #7 #8 #9 */ /** * 給圖片新增文字水印 可控制位置,旋轉,多行文字 **有效字型未驗證** * @param string $imgurl 圖片地址 * @param array $text 水印文字(多行以'|'分割) * @param int $fontSize 字型大小 * @param type $color 字型顏色 如: 255,255,255 * @param int $point 水印位置 * @param type $font 字型 * @param int $angle 旋轉角度 允許值: 0-90 270-360 不含 * @param string $newimgurl 新圖片地址 預設使用字尾命名圖片 * @return boolean*/ function createWordsWatermark($imgurl, $text, $fontSize = '14', $color = '0,0,0', $point = '1', $font = 'simhei.ttf', $angle = 0, $newimgurl = '') { $imageCreateFunArr = array('image/jpeg' => 'imagecreatefromjpeg', 'image/png' => 'imagecreatefrompng', 'image/gif' => 'imagecreatefromgif');$imageOutputFunArr = array('image/jpeg' => 'imagejpeg', 'image/png' => 'imagepng', 'image/gif' => 'imagegif'); //獲取圖片的mime型別 $imgsize = getimagesize($imgurl); if (empty($imgsize)) { return false; //not image } $imgWidth = $imgsize[0]; $imgHeight = $imgsize[1]; $imgMime= $imgsize['mime']; if (!isset($imageCreateFunArr[$imgMime])) { return false; //do not have create img function } if (!isset($imageOutputFunArr[$imgMime])) { return false; //do not have output img function } $imageCreateFun = $imageCreateFunArr[$imgMime]; $imageOutputFun = $imageOutputFunArr[$imgMime]; $im = $imageCreateFun($imgurl); /* * 引數判斷 */ $color = explode(',', $color); $text_color = imagecolorallocate($im, intval($color[0]), intval($color[1]), intval($color[2])); //文字水印顏色 $point = intval($point) > 0 && intval($point) < 10 ? intval($point) : 1; //文字水印所在的位置 $fontSize = intval($fontSize) > 0 ? intval($fontSize) : 14; $angle = ($angle >= 0 && $angle < 90 || $angle > 270 && $angle < 360) ? $angle : 0; //判斷輸入的angle值有效性 $fontUrl = './static/image/seccode/font/ch/' . ($font ? $font : 'simhei.ttf'); //有效字型未驗證 $text = explode('|', $text); $newimgurl = $newimgurl ? $newimgurl : $imgurl . '_WordsWatermark.jpg'; //新圖片地址 統一圖片字尾 /** * 根據文字所在圖片的位置方向,計算文字的座標 * 首先獲取文字的寬,高, 寫一行文字,超出圖片後是不顯示的 */ $textLength = count($text) - 1; $maxtext = 0; foreach ($text as $val) { $maxtext = strlen($val) > strlen($maxtext) ? $val : $maxtext; } $textSize = imagettfbbox($fontSize, 0, $fontUrl, $maxtext); $textWidth = $textSize[2] - $textSize[1]; //文字的最大寬度 $textHeight = $textSize[1] - $textSize[7]; //文字的高度 $lineHeight = $textHeight + 3; //文字的行高 //是否可以新增文字水印 只有圖片的可以容納文字水印時才新增 if ($textWidth + 40 > $imgWidth || $lineHeight * $textLength + 40 > $imgHeight) { return false; //圖片太小了,無法新增文字水印 } if ($point == 1) { //左上角 $porintLeft = 20; $pointTop = 20; } elseif ($point == 2) { //上中部 $porintLeft = floor(($imgWidth - $textWidth) / 2); $pointTop = 20; } elseif ($point == 3) { //右上部 $porintLeft = $imgWidth - $textWidth - 20; $pointTop = 20; } elseif ($point == 4) { //左中部 $porintLeft = 20; $pointTop = floor(($imgHeight - $textLength * $lineHeight) / 2); } elseif ($point == 5) { //正中部 $porintLeft = floor(($imgWidth - $textWidth) / 2); $pointTop = floor(($imgHeight - $textLength * $lineHeight) / 2); } elseif ($point == 6) { //右中部 $porintLeft = $imgWidth - $textWidth - 20; $pointTop = floor(($imgHeight - $textLength * $lineHeight) / 2); } elseif ($point == 7) { //左下部 $porintLeft = 20; $pointTop = $imgHeight - $textLength * $lineHeight - 20; } elseif ($point == 8) { //中下部 $porintLeft = floor(($imgWidth - $textWidth) / 2); $pointTop = $imgHeight - $textLength * $lineHeight - 20; } elseif ($point == 9) { //右下部 $porintLeft = $imgWidth - $textWidth - 20; $pointTop = $imgHeight - $textLength * $lineHeight - 20; } //如果有angle旋轉角度,則重新設定 top ,left 座標值 if ($angle != 0) { if ($angle < 90) { $diffTop = ceil(sin($angle * M_PI / 180) * $textWidth); if (in_array($point, array(1, 2, 3))) {// 上部 top 值增加 $pointTop += $diffTop; } elseif (in_array($point, array(4, 5, 6))) {// 中部 top 值根據圖片總高判斷 if ($textWidth > ceil($imgHeight / 2)) { $pointTop += ceil(($textWidth - $imgHeight / 2) / 2); } } } elseif ($angle > 270) { $diffTop = ceil(sin((360 - $angle) * M_PI / 180) * $textWidth); if (in_array($point, array(7, 8, 9))) {// 上部 top 值增加 $pointTop -= $diffTop; } elseif (in_array($point, array(4, 5, 6))) {// 中部 top 值根據圖片總高判斷 if ($textWidth > ceil($imgHeight / 2)) { $pointTop = ceil(($imgHeight - $diffTop) / 2); } } } } foreach ($text as $key => $val) { imagettftext($im, $fontSize, $angle, $porintLeft, $pointTop + $key * $lineHeight, $text_color, $fontUrl, $val); } // 輸出影象 $imageOutputFun($im, $newimgurl, 80); // 釋放記憶體 imagedestroy($im); return $newimgurl; } //$imgurl, $text, $fontSize='14', $color='0,0,0', $point='1', $font = 'simhei.ttf', $angle=0, $newimgurl='' $img = createWordsWatermark('./data/attachment/portal/200707/13/120000zb0zepfkpjkbpfbs.jpg', '時尚前沿|trands', '12', '255,1,1', '7', '', '30', './newpic.jpg'); echo '<img src="' . $img . '" />';