首页 >后端开发 >php教程 > 正文

一定搞得懂PHP中如何添加图片水印

原创2021-10-20 14:59:4301100
在之前的文章中给大家带来了《PHP中怎样完成图像的缩放和裁剪?(实例详解)》,其中通过实例给大家介绍了在PHP中应该怎样去进行图形的缩放和裁剪,本篇文章继续来看一看PHP中图形处理的知识,我们应该怎样给图片增加水印。希望对大家有帮助!

在我们的日常生活中,为了不希望自己的图片被盗用,经常能够看到在一些图片上添加水印,比如我们网站上,输入图片文件的话会自动在右下角加上一个水印,那么这种水印效果是怎么实现的呢?通过PHP就可以实现为图片增加水印的效果。

在之前文章中对图片进行裁剪放到目标图上的操作和添加水印有些类似,为了实现添加水印,需要通过 imagecopymerge函数。

imagecopymerge函数

imagecopymerge函数的语法格式如下:

imagecopymerge($目标图片,$来源图片,$目标开始的x ,$目标开始的y,$来源的x ,$来源的y ,$来源的宽 ,$来源的高 ,$透明度)

其中透明度的值是0-100的整数,透明度的值越大,水印越不透明。

接下来我们通过实例来看一下应该怎样给图片增加水印:

首先准备了一个名为test.png的图片和一个名为logo.png的水印图片放到了我们的根目录里

1020.19.png

注意上面这个是示例图片,下面的水印并不是我添加的,是网站自动添加的,为了区分,实例的水印是下面这样的

1020.15.png1020.20.png

那接下来,操作如下:

<?php
//打开目标图片
$dst = imagecreatefrompng('test.png');
//打开Logo来源图片
$src = imagecreatefrompng('logo.png');
//得到目标图片的宽高
$dst_info = getimagesize('test.png');
//得到logo图片的宽高
$src_info = getimagesize('logo.png');
//放到最右下脚可得出图片水印图片需要开始的位置即:
//x点位置:需要大图的宽 - 小图的宽;
//y点位置:放大图的高 - 小图的高
$dst_x = $dst_info[0] - $src_info[0];
$dst_y = $dst_info[1] - $src_info[1];
//要将图片加在右下脚
imagecopymerge($dst, $src, $dst_x, $dst_y, 0, 0, $src_info[0], $src_info[1], 50);
header('Content-type:image/png');
imagepng($dst);
imagedestroy($dst);
imagedestroy($src);
?>

输出结果:

1020.21.png

由上述结果可以看出,通过imagecopymerge函数添加了一个透明度为50的水印。

拓展知识imagecopy函数

不止使用imagecopymerge函数一种方法添加水印,也能够通过 imagecopy() 函数,它能够复制函数的一部分,它的语法格式如下:

imagecopy($目标图片, $来源图片,$目标图片x,$目标图片y,$来源图片x,$来源图片y,$来源图片宽,$来源图片高)

它的含义是,在来源图片的(x,y)的地方选取宽为w,高为h的矩形区域到目标图片的(x,y)上。

使用 PHP 中的 imagesx()、imagesy() 两个函数来分别获取图片的宽度和高度。它们的语法格式如下:

imagesx(resource $image)
imagesy(resource $image)

实例如下:

<?php
    function watermark($img, $watermark, $district = 0,$watermarkquality = 95){
        $imginfo = @getimagesize($img);
        $watermarkinfo = @getimagesize($watermark);
        $img_w = $imginfo[0];
        $img_h = $imginfo[1];
        $watermark_w = $watermarkinfo[0];
        $watermark_h = $watermarkinfo[1];
        if($district == 0) $district = rand(1,9);
        if(!is_int($district) OR 1 > $district OR $district > 9) $district = 9;
        switch($district){
            case 1:
                $x = +5;
                $y = +5;
                break;
            case 2:
                $x = ($img_w - $watermark_w) / 2;
                $y = +5;
                break;
            case 3:
                $x = $img_w - $watermark_w - 5;
                $y = +5;
                break;
            case 4:
                $x = +5;
                $y = ($img_h - $watermark_h) / 2;
                break;
            case 5:
                $x = ($img_w - $watermark_w) / 2;
                $y = ($img_h - $watermark_h) / 2;
                break;
            case 6:
                $x = $img_w - $watermark_w;
                $y = ($img_h - $watermark_h) / 2;
                break;
            case 7:
                $x = +5;
                $y = $img_h - $watermark_h - 5;
                break;
            case 8:
                $x = ($img_w - $watermark_w) / 2;
                $y = $img_h - $watermark_h - 5;
                break;
            case 9:
                $x = $img_w - $watermark_w - 5;
                $y = $img_h - $watermark_h - 5;
                break;
        }
        switch ($imginfo[2]) {
            case 1:
                $im = @imagecreatefromgif($img);
                break;
            case 2:
                $im = @imagecreatefromjpeg($img);
                break;
            case 3:
                $im = @imagecreatefrompng($img);
                break;
        }
        switch ($watermarkinfo[2]) {
            case 1:
                $watermark_logo = @imagecreatefromgif($watermark);
                break;
            case 2:
                $watermark_logo = @imagecreatefromjpeg($watermark);
                break;
            case 3:
                $watermark_logo = @imagecreatefrompng($watermark);
                break;
        }
        if(!$im or !$watermark_logo) return false;
        $dim = @imagecreatetruecolor($img_w, $img_h);
        if(@imagecopy($dim, $im, 0, 0, 0, 0,$img_w,$img_h )){
            imagecopy($dim, $watermark_logo, $x, $y, 0, 0, $watermark_w, $watermark_h);
        }
        $file = dirname($img) . '/w' . basename($img);
        $result = imagejpeg ($dim,$file,$watermarkquality);
        imagedestroy($watermark_logo);
        imagedestroy($dim);
        imagedestroy($im);
        if($result){
            echo $img.' 水印添加成功';
            return;
        }
        else {
            return false;
        }
    }
    $file = 'test.png';   //待加水印的图片地址
    $water = 'logo.png';  //水印图片的地址
    watermark($file, $water);
?>

输出结果:

1020.22.png

效果如下:

1020.23.png

推荐学习:《PHP视频教程

以上就是一定搞得懂PHP中如何添加图片水印的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码

声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理

  • 相关标签:PHP 图像处理
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • 专题推荐

    推荐视频教程
  • PHP开发基础之语法篇PHP开发基础之语法篇
  • PHP开发基础之数组篇PHP开发基础之数组篇
  • PHP开发基础之字符串篇PHP开发基础之字符串篇
  • PHP开发基础之类与对象篇PHP开发基础之类与对象篇
  • PHP开发基础之数据库篇(PDO)PHP开发基础之数据库篇(PDO)
  • 视频教程分类