PHP图片加水印实现方法

yizhihongxing

下面是“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实现计数器方法小结

    下面是关于“php实现计数器方法小结”的完整攻略: 计数器方法小结 什么是计数器方法? 计数器方法,指的是通过编写程序实现计数器功能。常见的有访问量统计、用户在线统计、商品点击量等。其主要原理是通过程序对数据进行统计、记录和显示。 如何实现计数器方法? 开发中,实现计数器方法具体步骤如下: 创建数据库表 在实现计数器方法之前,我们需要先创建数据库表。通常情况…

    PHP 2023年5月27日
    00
  • PHP购物车类Cart.class.php定义与用法示例

    “PHP购物车类Cart.class.php定义与用法示例”是一个用于实现网站购物车功能的PHP类。以下是该类的定义和使用说明: 定义 文件名:Cart.class.php 类名:Cart 属性: $cartId:购物车id $products:购物车商品列表 方法: __construct():构造函数,初始化购物车id和商品列表 add():添加商品到购…

    PHP 2023年5月26日
    00
  • PHP正确解析UTF-8字符串技巧应用

    以下是关于“PHP正确解析UTF-8字符串技巧应用”的完整攻略: 什么是UTF-8编码 UTF-8是一种通用的Unicode字符编码,其使用变长字节表示Unicode编码中的字符,具有广泛的应用价值。在PHP中,涉及到多语言编码的地方,我们通常可以使用UTF-8编码。 注意事项 在使用UTF-8编码时,需要注意以下几个问题: 在PHP脚本中,一定要在文件头部…

    PHP 2023年5月26日
    00
  • php+MySql实现登录系统与输出浏览者信息功能

    实现登录系统和输出浏览者信息是 Web 开发中非常基础的功能,可以通过 PHP 和 MySQL 来完成。 创建数据库和用户表 首先,需要创建一个 MySQL 数据库,然后创建一个用户表,包含用户名和密码的字段。可以使用以下 SQL 语句创建: CREATE DATABASE `user_db`; USE `user_db`; CREATE TABLE `us…

    PHP 2023年5月26日
    00
  • php中array_unshift()修改数组key注意事项分析

    当我们使用 PHP 中的 array_unshift() 函数向数组的开头添加新元素时,需要注意以下事项: 数组中所有原有的键名(key)会依次向后移动一位,从而为新的第一个元素腾出位置。 新插入的元素的键名会变成 0,即新元素成为数组的第一个元素。 示例1: // 原始数组 $array = array(‘a’ => 1, ‘b’ => 2, …

    PHP 2023年5月26日
    00
  • 浅谈PHP设计模式的注册树模式

    简介: 注册树模式,属于结构型的设计模式。一种很简单的设计模式 适用场景: 类似IOC。写一个庞大的类库的时候,为了方便各种资源的归纳,可以统一放到一棵树上。 优点: 把一个个游兵散将一样的对象进行统一管理。 另外可以根据项目的业务场景自定义层级。 缺点: 增加项目的复杂性。 纯粹的注册树写法,缺少单例模式的有点,可能存在重复创建对象的可能,需要做额外的验证…

    PHP 2023年4月18日
    00
  • php获取、检查类名、函数名、方法名的函数方法

    当我们编写PHP程序时,有时需要获取、检查类名、函数名或方法名,来完成一些特定的操作。下面,我们将详细介绍如何获取、检查类名、函数名或方法名的方法。 获取类名 获取类名的方法很简单,只需要使用PHP内置的get_class()函数即可。它可以接受一个对象或类的名称或实例作为参数,并返回该对象或类的名称。示例如下: class Car { // … } e…

    PHP 2023年5月27日
    00
  • PHP简单装饰器模式实现与用法示例

    下面我将为你详细讲解“PHP简单装饰器模式实现与用法示例”的完整攻略。 PHP简单装饰器模式实现与用法示例 一、什么是装饰器模式 装饰器模式(Decorator Pattern)是一种设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它允许通过添加函数封装来动态改变对象的行为。 二、装饰器模式的实现 在 PH…

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