当前位置:   article > 正文

PHP图片水印类(GD库)

PHP图片水印类(GD库)

这几天学习了一下GD扩展库,昨天写了一个图片验证码,今天继续写了一个给图片增加水印的类。

什么是图片水印

先来看一下什么是水印:

水印,是指在造纸过程中形成的,“夹”在纸中而不是在纸的表面,迎光透视时可以清晰看到有明暗纹理的图形、人像或文字,它是纸张在生产过程中用改变纸浆纤维密度的方法而制成的。通常人民币、购物卷、粮票、证劵等等,都采用此方式,以防止造假

类似的,图片水印就是在自己制作的图片或自己网站的图片上贴上一个标签 , 表明作者信息或网站信息,也可以防止别人盗用。
通常水印可以是文字或者另一图片,并且有一定透明度,不影响原图的查看。

PHP生成水印图的步骤

这里的水印可以是文字或者是图片。
1. 打开需要处理的图片
2. 计算水印的位置
3. 增加水印(文字或图片)
4. 保存新图片
5. 释放资源(可以省略,php可以自动释放)

所使用的GD函数

打开和关闭图片就不说了,这里说的是处理图片水印所需要的GD函数

1.计算文本框大小所需要的函数

array imageftbbox ( float $size , float $angle , string $fontfile , string $text [, array $extrainfo ] )
  • 1

该函数返回文本框四个角的坐标,利用这些坐标就可以计算出文本的宽度和高度了。

2.计算图片大小所需要的函数:

int imagesx ( resource $image )
int imagesy ( resource $image )
  • 1
  • 2

imagesx 返回图片宽度,imagesy 返回图片高度

3.贴图函数1

bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )
  • 1

说明:

将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。

4.贴图函数2

bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
  • 1

说明:

将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。

5.添加文字水印

array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
  • 1

说明:使用 TrueType 字体将 指定的 text 写入图像。

更详细的说明:请戳这里

PHP图片水印类

下面的图片水印类所实现的功能:
1. 增加文字水印
2. 增加图片水印
3. 保存水印后的图片
4. 输出水印后的图片
5. 可以在9个固定位置增加水印:左上、上中、右上、左中、居中、右中、左下、下中、右下

使用时需要注意的问题:
1.水印图片或者文字大小不能超过原图的大小,否则会处理失败。
2.保存图片和输出到浏览器同时使用时,需要先输出到浏览器,不然无法保存。

图片水印类代码:ImageStamp.class.php

<?php

/**
 * 图片水印类
 * 支持文字水印和图片水印, 支持水印透明度设置
 * 支持的图片类型: 'jpg', 'png', 'gif'
 * @author luoluolzb 2017/6/17
 */
class ImageStamp
{
    
    /**
     * 确定水印位置的常量
     * @var const
     */
    const
    STAMP_TOP = 1,
    STAMP_BOTTOM = 2,
    STAMP_LEFT = 4,
    STAMP_RIGHT = 8,
    STAMP_CENTER = 16;

    /**
     * 水印距离图片边缘的距离(非居中时)常量
     * @var const
     */
    const STAMP_SIDE = 10;

    /**
     * 水印默认位置
     * @var const
     */
    const STAMP_DEFAULT_LOC = 10;    //STAMP_BOTTOM | STAMP_RIGHT

    /**
     * @var private
     */
    private $fileName, $mimeString, $imgRes;
    private $imgWidth, $imgHeight;

    /**
     * 打开需要加水印的图片
     * 此函数可以多次使用, 第二次会覆盖第一次
     * @param   string $fileName 图片文件
     * @return  bool   操作结果
     */
    public function Open($fileName){
    
        if(!file_exists($fileName)){
            return false;
        }
        if($this->imgRes){
            imagedestroy($this->imgRes);
        }

        $this->fileName = $fileName;
        $this->mimeString = self::GetImageMime($fileName);
        $this->imgRes = self::ImageCreate($fileName, $this->mimeString);

        if(! $this->imgRes){
            return false;
        }
        $this
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/326016
推荐阅读
相关标签
  

闽ICP备14008679号