PHP實現(xiàn)添加圖片水印的示例代碼
以下是 `_imgWatermark` 函數(shù)的中文注釋和解析。該函數(shù)用于在圖像上添加水?。?/p>
function _imgWatermark($src_image, $water_image, $path_image = '', $position = 10, $pct = 30, $angle = 15) { // 檢查源圖和水印圖文件是否存在 if (!is_file($src_image)) { $error = '源圖不存在'; return false; } if (!is_file($water_image)) { $error = '水印圖不存在'; return false; } // 獲取圖片信息 $src_info = getimagesize($src_image); $water_info = getimagesize($water_image); // 定義允許的圖片 MIME 類型 $allow = array( 'image/jpeg' => 'jpeg', 'image/gif' => 'gif', 'image/jpg' => 'jpg', 'image/png' => 'png', 'image/pjpeg' => 'jpeg' ); // 檢查圖像類型是否被允許 if (!array_key_exists($src_info['mime'], $allow)) { $error = "源圖類型不支持添加水印"; return false; } if (!array_key_exists($water_info['mime'], $allow)) { $error = "水印圖類型不支持"; return false; } // 根據(jù) MIME 類型創(chuàng)建打開和保存圖片的函數(shù) $src_open = 'imagecreatefrom' . $allow[$src_info['mime']]; $water_open = 'imagecreatefrom' . $allow[$water_info['mime']]; $src_save = 'image' . $allow[$src_info['mime']]; // 打開圖像資源 $src = $src_open($src_image); $water = $water_open($water_image); // 根據(jù)比例計算水印的新尺寸 $scale_factor = 0.15; // 水印的相對大小比例 $new_water_width = $src_info[0] * $scale_factor; $new_water_height = ($water_info[1] / $water_info[0]) * $new_water_width; // 創(chuàng)建縮放后的水印圖 $resized_water = imagecreatetruecolor($new_water_width, $new_water_height); imagealphablending($resized_water, false); imagesavealpha($resized_water, true); imagecopyresampled($resized_water, $water, 0, 0, 0, 0, $new_water_width, $new_water_height, $water_info[0], $water_info[1]); // 釋放原始水印資源,使用縮放后的水印 imagedestroy($water); $water = $resized_water; $water_info[0] = $new_water_width; $water_info[1] = $new_water_height; if ($angle) { // 旋轉(zhuǎn)水印圖片 $water = imagerotate($water, $angle, imageColorAllocateAlpha($water, 0, 0, 0, 127)); // 獲取旋轉(zhuǎn)后的水印尺寸 $sourceInfo[0] = imagesx($water); $sourceInfo[1] = imagesy($water); // 設(shè)置水印平鋪的間距 $ww = $src_info[0] * 0.1; // 水平方向間距 $hh = $src_info[1] * 0.1; // 垂直方向間距 } if ($position == 10) { $offset_x = $water_info[0] / 2; } // 計算水印在源圖中的位置 $start_x = $start_y = 0; switch ($position) { case 1: break; case 2: $start_x = floor(($src_info[0] - $water_info[0]) / 2); break; case 3: $start_x = $src_info[0] - $water_info[0]; break; case 4: $start_y = floor(($src_info[1] - $water_info[1]) / 2); break; case 5: $start_x = floor(($src_info[0] - $water_info[0]) / 2); $start_y = floor(($src_info[1] - $water_info[1]) / 2); break; case 6: $start_x = $src_info[0] - $water_info[0]; $start_y = floor(($src_info[1] - $water_info[1]) / 2); break; case 7: $start_y = $src_info[1] - $water_info[1]; break; case 8: $start_x = floor(($src_info[0] - $water_info[0]) / 2); $start_y = $src_info[1] - $water_info[1]; break; case 9: $start_x = $src_info[0] - $water_info[0]; $start_y = $src_info[1] - $water_info[1]; break; case 10: // 創(chuàng)建用于平鋪的圖像資源 $fun = 'imagecreatefrom' . image_type_to_extension($src_info[2], false); $thumb = $fun($src_image); // 定義總長度 $start_x = $src_info[0] - 0; $start_y = $src_info[1] - 0; $index = 0; $ccasd = 0; $ccasdy = 0; // 循環(huán)平鋪水印 for ($x = 0; $x < $start_x; $x) { for ($y = 0; $y < $start_y; $y) { if ($x == 0 && $y == 0) { $x = round($ww / 2); } $index++; imagecopy($src, $thumb, 0, 0, $x + $ccasd - $offset_x, $y + $ccasdy, $sourceInfo[0], $sourceInfo[1]); imagecopy($src, $water, 0, 0, 0, 0, $sourceInfo[0], $sourceInfo[1]); imagecopymerge($thumb, $src, $x + $ccasd - $offset_x, $y + $ccasdy, 0, 0, $sourceInfo[0], $sourceInfo[1], $pct); $y += $sourceInfo[1] + $hh; } $x += $sourceInfo[0] + $ww; $index = 0; } $src_save($thumb, $path_image); imagedestroy($src); imagedestroy($water); return $imagename; break; } // 合并水印到源圖 if (imagecopymerge($src, $water, $start_x, $start_y, 0, 0, $water_info[0], $water_info[1], $pct) && $position != 10) { $src_save($src, $path_image); imagedestroy($src); imagedestroy($water); return $imagename; } else { $error = "水印制作失敗"; return false; } }
關(guān)鍵點:
- **文件存在性檢查:** 確保源圖和水印圖文件存在。
- **支持的圖像類型:** 驗證圖像是否屬于支持的類型(JPEG、GIF、PNG)。
- **圖像縮放:** 根據(jù)比例縮放水印圖,使其相對于源圖的尺寸更小。
- **水印位置:** 水印可以根據(jù) `position` 參數(shù)被放置在源圖的不同位置。
- **水印平鋪:** 如果 `position` 設(shè)置為 10,水印將在整個圖像上平鋪。
- **透明度和旋轉(zhuǎn):** 水印可以通過 `angle` 和 `pct` 參數(shù)進行旋轉(zhuǎn)和調(diào)整透明度。
- **資源管理:** 函數(shù)確保所有圖像資源在使用后被銷毀以釋放內(nèi)存。
該函數(shù)為圖像添加水印提供了靈活的方式,允許用戶自定義水印的位置、透明度和平鋪方式。
到此這篇關(guān)于PHP實現(xiàn)添加圖片水印的示例代碼的文章就介紹到這了,更多相關(guān)PHP添加圖片水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP面向?qū)ο蟮倪M階學(xué)習(抽像類、接口、final、類常量)
PHP面向?qū)ο蟮倪M階學(xué)習,主要包括抽像類、接口、final、類常量的一些資料2012-05-05php連接與操作PostgreSQL數(shù)據(jù)庫的方法
這篇文章主要介紹了php連接與操作PostgreSQL數(shù)據(jù)庫的方法,以實例形式較為詳細的分析了php連接PostgreSQL數(shù)據(jù)庫以及進行讀取與增加、修改、刪除等技巧,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12解析PHP中的file_get_contents獲取遠程頁面亂碼的問題
本篇文章是對PHP中的file_get_contents獲取遠程頁面出現(xiàn)亂碼的問題進行了詳細的分析介紹,需要的朋友參考下2013-06-06PHP編碼轉(zhuǎn)換函數(shù) 自動轉(zhuǎn)換字符集支持數(shù)組轉(zhuǎn)換
當我們在接受未知客戶端提交的數(shù)據(jù),由于各客戶端的編碼不統(tǒng)一,但在我們的服務(wù)器端最終只能以一種編碼方式來處理,這種情況下就會涉及到編碼轉(zhuǎn)換問題2012-12-12