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 ] )

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

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

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

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 )

说明:

将 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 )

说明:

将 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 )

说明:使用 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值