下面是“PHP图片加水印实现方法”的详细攻略。
1. 准备工作
在进行加水印操作前,需要确保安装了 PHP 的 GD 库。如果没有安装,可以通过以下命令进行安装:
sudo apt-get install php7.2-gd
同时需要准备一张水印图片,该图片可以是 PNG、JPG 或 GIF 格式。我们可以先随便找张图片用于测试。
2. 实现步骤
2.1 打开原图片和水印图片
使用 PHP 的 imagecreatefromjpeg
、imagecreatefrompng
或 imagecreatefromgif
函数,打开需要加水印的图片和水印图片,生成对应的图像资源。
//打开原图片
$srcImg = imagecreatefromjpeg('original.jpg'); //这里以 JPG 格式为例
//打开水印图片
$watermarkImg = imagecreatefrompng('watermark.png'); //这里以 PNG 格式为例
2.2 获取图片信息和水印图片信息
使用 PHP 的 getimagesize
函数获取原图片和水印图片的宽度和高度信息,以便后续计算水印位置。同时也需要获取水印图片的透明度信息。
//获取原图片信息
$srcImgInfo = getimagesize('original.jpg');
$srcWidth = $srcImgInfo[0];
$srcHeight = $srcImgInfo[1];
//获取水印图片信息
$watermarkImgInfo = getimagesize('watermark.png');
$watermarkWidth = $watermarkImgInfo[0];
$watermarkHeight = $watermarkImgInfo[1];
$watermarkTransparency = imagecolorsforindex($watermarkImg, imagecolorat($watermarkImg, 0, 0))['alpha'];
2.3 计算水印位置
根据原图片和水印图片的宽度和高度信息,计算水印的位置。通常情况下,水印放在原图片右下角比较合适。
//计算水印位置
$x = $srcWidth - $watermarkWidth - 10; //水印距离右边 10 像素
$y = $srcHeight - $watermarkHeight - 10; //水印距离底部 10 像素
2.4 将水印图片复制到原图片上
使用 PHP 的 imagecopy
或 imagecopymerge
函数将水印图片复制到原图片上,并设定水印的位置和透明度。
//将水印图片复制到原图片上
if ($watermarkTransparency < 127) { //不透明度较低,采用 imagecopy 函数
imagecopy($srcImg, $watermarkImg, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight);
} else { //不透明度较高,采用 imagecopymerge 函数
imagecopymerge($srcImg, $watermarkImg, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight, 50);
}
2.5 保存加水印后的图片
使用 PHP 的 imagejpeg
、imagepng
或 imagegif
函数,将加水印后的图片保存到指定目录中。
//保存加水印后的图片
imagejpeg($srcImg, 'watermarked.jpg'); //这里以 JPG 格式为例
3. 示例说明
示例 1
下面是一个简单的 PHP 图片加水印的示例代码:
//打开原图片
$srcImg = imagecreatefromjpeg('original.jpg'); //这里以 JPG 格式为例
//打开水印图片
$watermarkImg = imagecreatefrompng('watermark.png'); //这里以 PNG 格式为例
//获取原图片信息
$srcImgInfo = getimagesize('original.jpg');
$srcWidth = $srcImgInfo[0];
$srcHeight = $srcImgInfo[1];
//获取水印图片信息
$watermarkImgInfo = getimagesize('watermark.png');
$watermarkWidth = $watermarkImgInfo[0];
$watermarkHeight = $watermarkImgInfo[1];
$watermarkTransparency = imagecolorsforindex($watermarkImg, imagecolorat($watermarkImg, 0, 0))['alpha'];
//计算水印位置
$x = $srcWidth - $watermarkWidth - 10; //水印距离右边 10 像素
$y = $srcHeight - $watermarkHeight - 10; //水印距离底部 10 像素
//将水印图片复制到原图片上
if ($watermarkTransparency < 127) { //不透明度较低,采用 imagecopy 函数
imagecopy($srcImg, $watermarkImg, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight);
} else { //不透明度较高,采用 imagecopymerge 函数
imagecopymerge($srcImg, $watermarkImg, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight, 50);
}
//保存加水印后的图片
imagejpeg($srcImg, 'watermarked.jpg'); //这里以 JPG 格式为例
示例 2
下面是另一个示例代码,使用 PHP 的函数库封装了加水印的方法,让操作更加简单:
/**
* 添加水印
*
* @param string $srcImagePath 原图片路径
* @param string $watermarkImagePath 水印图片路径
* @param int $x 水印位置x轴坐标
* @param int $y 水印位置y轴坐标
*/
function addWatermark($srcImagePath, $watermarkImagePath, $x, $y)
{
//打开原图片
$srcImg = imagecreatefromjpeg($srcImagePath); //这里以 JPG 格式为例
//打开水印图片
$watermarkImg = imagecreatefrompng($watermarkImagePath); //这里以 PNG 格式为例
//获取原图片信息
$srcImgInfo = getimagesize($srcImagePath);
$srcWidth = $srcImgInfo[0];
$srcHeight = $srcImgInfo[1];
//获取水印图片信息
$watermarkImgInfo = getimagesize($watermarkImagePath);
$watermarkWidth = $watermarkImgInfo[0];
$watermarkHeight = $watermarkImgInfo[1];
$watermarkTransparency = imagecolorsforindex($watermarkImg, imagecolorat($watermarkImg, 0, 0))['alpha'];
//将水印图片复制到原图片上
if ($watermarkTransparency < 127) { //不透明度较低,采用 imagecopy 函数
imagecopy($srcImg, $watermarkImg, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight);
} else { //不透明度较高,采用 imagecopymerge 函数
imagecopymerge($srcImg, $watermarkImg, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight, 50);
}
//保存加水印后的图片
imagejpeg($srcImg, 'watermarked.jpg'); //这里以 JPG 格式为例
}
//示例调用
addWatermark('original.jpg', 'watermark.png', 10, 10);
注意:示例 2 仅供参考,不保证在所有环境下都能正常运行。这里的 imagecreatefromjpeg
、imagecreatefrompng
、imagecreatefromgif
、imagejpeg
、imagepng
、imagegif
、getimagesize
、imagecolorsforindex
、imagecolorat
、imagecopy
和 imagecopymerge
函数都需要 PHP 的 GD 库支持,在一些比较简单的 PHP 网站环境中可能无法使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP图片加水印实现方法 - Python技术站