PHP图片加水印实现方法

下面是“PHP图片加水印实现方法”的详细攻略。

1. 准备工作

在进行加水印操作前,需要确保安装了 PHP 的 GD 库。如果没有安装,可以通过以下命令进行安装:

sudo apt-get install php7.2-gd

同时需要准备一张水印图片,该图片可以是 PNG、JPG 或 GIF 格式。我们可以先随便找张图片用于测试。

2. 实现步骤

2.1 打开原图片和水印图片

使用 PHP 的 imagecreatefromjpegimagecreatefrompngimagecreatefromgif 函数,打开需要加水印的图片和水印图片,生成对应的图像资源。

//打开原图片
$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 的 imagecopyimagecopymerge 函数将水印图片复制到原图片上,并设定水印的位置和透明度。

//将水印图片复制到原图片上
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 的 imagejpegimagepngimagegif 函数,将加水印后的图片保存到指定目录中。

//保存加水印后的图片
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 仅供参考,不保证在所有环境下都能正常运行。这里的 imagecreatefromjpegimagecreatefrompngimagecreatefromgifimagejpegimagepngimagegifgetimagesizeimagecolorsforindeximagecoloratimagecopyimagecopymerge 函数都需要 PHP 的 GD 库支持,在一些比较简单的 PHP 网站环境中可能无法使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP图片加水印实现方法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析

    关于php中判断方法或函数是否存在,PHP提供了以下三个函数: function_exists(): 用于判断函数是否存在 method_exists(): 用于判断方法是否存在 is_callable(): 用于判断函数或方法是否可调用 function_exists() function_exists()函数用于判断指定的函数是否被定义。该函数需要传入一…

    PHP 2023年5月26日
    00
  • 详细分析PHP 命名空间(namespace)

    下面是详细分析PHP 命名空间(namespace)的完整攻略: 什么是命名空间(namespace) 命名空间是PHP5.3的一个新特性。命名空间通过分离不同的代码来避免命名冲突。可以把命名空间看成一种包装器,将一组相关的函数、类和常量“封装”起来,形成独立的标识符,防止和别的程序发生冲突。 命名空间的使用 我们可以将一个类、函数或常量放入命名空间中,使用…

    PHP 2023年5月26日
    00
  • 简单谈谈PHP中strlen 函数

    当需要计算字符串长度时,可以使用PHP中的strlen函数。这个函数是一个非常简单但重要的函数,可以帮助我们在编码时更加高效地操作字符串。本文将详细介绍PHP中的strlen函数,包括语法、返回值以及一些实际应用案例。 1. 语法 PHP中strlen函数的语法如下: int strlen(string $string) 此处的 $string 是字符串参数…

    PHP 2023年5月26日
    00
  • PHP守护进程实例

    对于“PHP守护进程实例”的完整攻略,我们可以从以下几个部分进行讲解: 1. 守护进程简介 守护进程(Daemon)是一类在后台运行的系统进程,不受用户登录和注销的影响,一般用于后台任务的处理,如日志记录、定时任务等。 在linux系统中,我们可以使用nohup命令将一个普通的进程变成守护进程。而在PHP中,我们也可以通过一些特定的函数和方法来实现守护进程的…

    PHP 2023年5月30日
    00
  • php的list()的一步操作给一组变量进行赋值的使用

    list() 函数是一个用于将数组中的值赋给一组变量的 PHP 函数。可以说,这是一种批量赋值的方式。接下来,我将详细讲解 list() 函数的使用方法。 基本语法 list($var1, $var2, …) = array(expression1, expression2, …); 可以看到,list() 函数的基本语法非常简单,以一组变量名作为左…

    PHP 2023年5月26日
    00
  • PHP服务器端API原理及示例讲解(接口开发)

    标题:PHP 服务器端 API 原理及示例讲解 什么是服务器端 API 服务器端 API 是指能够在服务器端响应请求的一系列接口和协议,用于实现服务器端与客户端之间的数据传输,方便不同系统之间的交互和数据共享。 PHP 服务器端 API 的原理 PHP 是一种服务器端编程语言,具有强大的服务器端编程能力,因此被广泛应用于 Web 应用程序的开发中,同时也成为…

    PHP 2023年5月23日
    00
  • php使用array_search函数实现数组查找的方法

    下面是详细讲解“php使用array_search函数实现数组查找的方法”的完整攻略。 array_search函数简介 PHP中的array_search函数用于查找数组中指定值的键,如果成功找到则返回该键,否则返回false。 array_search函数的参数 array_search函数的参数如下: array_search($needle, $ha…

    PHP 2023年5月26日
    00
  • 遭遇php的in_array低性能问题

    当使用in_array()函数来查找一个值是否在一个数组中存在时,如果该数组中的元素数量较多,该函数的性能会受到影响。本攻略将详细讲解如何遭遇php的in_array()低性能问题以及优化的方法,包含以下几个方面: 性能分析 优化方案 性能分析 查看API文档 在使用in_array()函数之前,我们需要先了解这个函数的使用方式和限制条件。可以查看官方文档或…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部