半透明水印函数php

半透明水印是一种在图片中加入透明标志,以防止图片被未经授权的使用或者另作他用的一种方法。在实际应用中,半透明水印被广泛应用于图片的版权保护、数字图像加密等领域。

在PHP中,可以通过编写函数来实现在图片中添加半透明水印的效果,从而保护图片的版权。下面我们就来看一下如何编写这样的函数。

首先,我们需要用PHP中的GD库来处理图片。GD库是一个开源的代码库,它包含了一系列的函数,用来处理图形图像。使用GD库,我们可以轻松地在PHP中创建和处理图片。

在PHP中使用GD库需要先判断服务器是否支持GD库,可以通过phpinfo()函数来查看php配置信息的方式来判断是否支持GD库。

接下来,我们可以开始编写添加水印的函数,下面是一个示例代码:

```

// 定义水印图片路径

define('WATERMARK_IMG', './watermark.png');

/**

* 图片加水印

* @param $src_img 原始图片

* @param $dst_img 加水印后的图片保存路径

*/

function add_watermark($src_img, $dst_img) {

// 获取原图尺寸、类型

$src_info = getimagesize($src_img);

$src_w = $src_info[0];

$src_h = $src_info[1];

$src_type = $src_info[2];

// 根据图像类型创建源图像和目标图像

switch($src_type) {

case IMAGETYPE_JPEG:

$src_im = imagecreatefromjpeg($src_img);

break;

case IMAGETYPE_PNG:

$src_im = imagecreatefrompng($src_img);

break;

case IMAGETYPE_GIF:

$src_im = imagecreatefromgif($src_img);

break;

default:

die('不支持的文件类型');

}

// 创建水印图像

$wm_im = imagecreatefrompng(WATERMARK_IMG);

$wm_w = imagesx($wm_im);

$wm_h = imagesy($wm_im);

// 把水印添加到原图上

imagecopymerge($src_im, $wm_im, $src_w - $wm_w - 10, $src_h - $wm_h - 10, 0, 0, $wm_w, $wm_h, 50);

// 输出保存图像

imagejpeg($src_im, $dst_img, 100);

// 释放资源

imagedestroy($src_im);

imagedestroy($wm_im);

}

?>

```

上面的代码中,我们首先定义了一个常量WATERMARK_IMG,用来保存半透明水印的图片路径。接着,我们定义了一个函数add_watermark,该函数接受两个参数$src_img和$dst_img,分别是原始图片的路径和添加水印后的图片保存路径。

在函数中,我们首先使用PHP内置函数getimagesize获取原始图片的宽、高以及类型信息,然后根据图片类型创建源图像和目标图像。接着,我们创建水印图像,并将水印添加到原图上,最后输出并保存添加水印后的图片。

在上述代码中,我们使用了imagecopymerge函数来把水印添加到原图上。该函数有九个参数,分别是源图像、水印图像、目标图像中水印坐标x、目标图像中水印坐标y、水印图像中的x坐标、水印图像中的y坐标、水印宽度、水印高度以及透明度。其中,透明度范围是0-100,0表示完全透明,100表示完全不透明。

最后,在函数执行完毕后,我们需要使用一个imagedestroy函数来释放资源,避免出现内存泄漏的问题。

除了函数外,我们还可以使用存储过程来实现添加半透明水印的功能。存储过程是在数据库中创建的一段存储代码,它可以被视为一种批处理命令,形如函数一样被调用。

在MySQL数据库中,我们可以使用以下代码来创建一个添加水印的存储过程:

```

CREATE PROCEDURE `add_watermark`(IN `src_img` VARCHAR(255), IN `dst_img` VARCHAR(255))

BEGIN

DECLARE src_w INT;

DECLARE src_h INT;

DECLARE src_type INT;

DECLARE dst_im BLOB;

DECLARE wm_im BLOB;

DECLARE wm_w INT;

DECLARE wm_h INT;

SET @query = CONCAT("SELECT ", quote('"'), "src_w", quote('"'), ", ", quote('"'), "src_h", quote('"'), ", ", quote('"'), "src_type", quote('"'), ", ", quote('"'), "src_data", quote('"'), " INTO @src_w, @src_h, @src_type, @dst_im FROM (SELECT ", quote('"'), "src_w", quote('"'), ", ", quote('"'), "src_h", quote('"'), ", ", quote('"'), "src_type", quote('"'), ", ", quote('"'), "src_data", quote('"'), " FROM image_table WHERE file_path = '", src_img, "' LIMIT 1) AS t");

PREPARE q FROM @query;

EXECUTE q;

DEALLOCATE PREPARE q;

CASE @src_type

WHEN 1 THEN SET @src_im = CONCAT("imagecreatefromgif('", src_img, "')");

WHEN 2 THEN SET @src_im = CONCAT("imagecreatefromjpeg('", src_img, "')");

WHEN 3 THEN SET @src_im = CONCAT("imagecreatefrompng('", src_img, "')");

END CASE;

SET @query = CONCAT("SELECT img_data INTO @wm_im FROM (SELECT img_data FROM watermark_table WHERE watermark_id = 1 LIMIT 1) AS t");

PREPARE q FROM @query;

EXECUTE q;

DEALLOCATE PREPARE q;

SET @wm_im = CONCAT("imagecreatefromstring('", @wm_im, "')");

SET @wm_w = CONCAT("imagesx(", @wm_im, ")");

SET @wm_h = CONCAT("imagesy(", @wm_im, ")");

SET @dst_im = CONCAT("imagecreatefromstring(", @dst_im, ")");

SET @dst_w = CONCAT("imagesx(", @dst_im, ")");

SET @dst_h = CONCAT("imagesy(", @dst_im, ")");

SET @dst_x = CONCAT("@dst_w - @wm_w - 10");

SET @dst_y = CONCAT("@dst_h - @wm_h - 10");

SET @src_x = 0;

SET @src_y = 0;

SET @src_wm = CONCAT("imagecopymerge(", @dst_im, ", ", @wm_im, ", @dst_x, @dst_y, @src_x, @src_y, @wm_w, @wm_h, 50)");

PREPARE q FROM @src_wm;

EXECUTE q;

DEALLOCATE PREPARE q;

SET @dst_data = CONCAT("NULL");

SET @dst_data = CONCAT("imagejpeg(", @dst_im, ", '", dst_img, "', 100)");

PREPARE q FROM @dst_data;

EXECUTE q;

DEALLOCATE PREPARE q;

SET @src_im = CONCAT("imagedestroy(", @src_im, ")");

SET @wm_im = CONCAT("imagedestroy(", @wm_im, ")");

SET @dst_im = CONCAT("imagedestroy(", @dst_im, ")");

PREPARE q FROM @src_im;

EXECUTE q;

DEALLOCATE PREPARE q;

PREPARE q FROM @wm_im;

EXECUTE q;

DEALLOCATE PREPARE q;

PREPARE q FROM @dst_im;

EXECUTE q;

DEALLOCATE PREPARE q;

END

```

在上述代码中,我们首先定义了一个存储过程add_watermark,该存储过程接受两个输入参数$src_img和$dst_img,分别是原始图片路径和添加水印后的图片保存路径。

在存储过程中,我们首先使用SELECT语句获取原始图片的宽、高、类型以及二进制数据。接着,根据类型使用CASE语句选择对应的函数来创建源图像。然后,我们使用SELECT语句获取水印图片的二进制数据,再通过imagecreatefromstring函数来创建水印图像。

接下来,我们使用imagecopymerge函数来把水印添加到目标图像上,然后输出并保存添加水印后的图片。最后,我们需要使用imagedestroy函数来释放资源。

通过这样的存储过程,我们可以实现在MySQL数据库中直接进行图片处理,并将结果进行保存。

总结:在PHP中实现添加半透明水印的方法,可以使用GD库中的函数或者在MySQL数据库中创建存储过程进行处理。其中,函数实现简单,便于灵活使用;而存储过程则可以批量处理图片,并能够直接在MySQL数据库中进行图片编辑,便于管理和维护。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(22) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部