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編程實現(xiàn)微信企業(yè)向用戶付款的方法示例
這篇文章主要介紹了PHP編程實現(xiàn)微信企業(yè)向用戶付款的方法,涉及php針對微信接口調(diào)用、配置及交互操作相關(guān)技巧,需要的朋友可以參考下2017-07-07
PHP使用enqueue/amqp-lib實現(xiàn)rabbitmq任務(wù)處理
這篇文章主要為大家詳細介紹了PHP如何使用enqueue/amqp-lib實現(xiàn)rabbitmq任務(wù)處理,文中的示例代碼講解詳細,感興趣的小伙伴可以學(xué)習(xí)一下2024-03-03
使用PHP函數(shù)進行網(wǎng)站性能監(jiān)控和優(yōu)化的代碼示例
在 PHP 中,有許多內(nèi)置函數(shù)和工具可以幫助我們實現(xiàn)網(wǎng)站的性能監(jiān)控和優(yōu)化,本文將介紹幾種常用的 PHP 函數(shù),并提供相應(yīng)的代碼示例,來幫助您更好地進行網(wǎng)站性能監(jiān)控和優(yōu)化,需要的朋友可以參考下2024-06-06

