0

0

php图片加水印类,支持文字水印、透明度设置、自定义水印类

伊谢尔伦

伊谢尔伦

发布时间:2016-11-23 14:49:44

|

3379人浏览过

|

来源于php中文网

原创

<?php
 
/*
 
*Version: 1.0
 
*Author: River
 
*URL: http://www.phpxs.com/
 
*/
 
 
 
/**
 
 * 图片加水印类,支持文字水印、透明度设置、自定义水印位置等。
 
 * 使用示例:
 
 *      $obj = new WaterMask($imgFileName);             //实例化对象
 
 *      $obj->$waterType = 1;                        //类型:0为文字水印、1为图片水印
 
 *      $obj->$transparent = 45;                 //水印透明度
 
 *      $obj->$waterStr = 'www.codetc.com';              //水印文字
 
 *      $obj->$fontSize = 18;                        //文字字体大小
 
 *      $obj->$fontColor = array(255,255,255);               //水印文字颜色(RGB)
 
 *      $obj->$fontFile = 'AHGBold.ttf';             //字体文件
 
 *     ……
 
 *      $obj->output();                          //输出水印图片文件覆盖到输入的图片文件
 
 */
 
class WaterMask{
 
    public  $waterType          = 0;                    //水印类型:0为文字水印、1为图片水印
 
    public  $pos                = 0;                 //水印位置
 
    public  $transparent        = 45;                    //水印透明度
 
  
 
    public  $waterStr           = 'www.codetc.com';         //水印文字
 
    public  $fontSize           = 18;                   //文字字体大小
 
    public  $fontColor          = array(255,255,255);           //水印文字颜色(RGB)
 
    public  $fontFile           = 'AHGBold.ttf';            //字体文件
 
  
 
    public  $waterImg           = 'logo.png';               //水印图片
 
  
 
    private $srcImg             = '';                   //需要添加水印的图片
 
    private $im                 = '';                 //图片句柄
 
    private $water_im           = '';                    //水印图片句柄
 
    private $srcImg_info        = '';                 //图片信息
 
    private $waterImg_info      = '';                  //水印图片信息
 
    private $str_w              = '';                  //水印文字宽度
 
    private $str_h              = '';                  //水印文字高度
 
    private $x                  = '';                    //水印X坐标
 
    private $y                  = '';                    //水印y坐标
 
  
 
    function __construct($img) {        //析构函数
 
        $this->srcImg = file_exists($img) ? $img : die('"'.$img.'" 源文件不存在!');
 
    }
 
 
 
    private function imginfo() {  //获取需要添加水印的图片的信息,并载入图片。
 
        $this->srcImg_info = getimagesize($this->srcImg);
 
        switch ($this->srcImg_info[2]) {
 
            case 3:
 
                $this->im = imagecreatefrompng($this->srcImg);
 
                break 1;
 
            case 2:
 
                $this->im = imagecreatefromjpeg($this->srcImg);
 
                break 1;
 
            case 1:
 
                $this->im = imagecreatefromgif($this->srcImg);
 
                break 1;
 
            default:
 
                die('原图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。');
 
        }
 
    }
 
 
 
    private function waterimginfo() { //获取水印图片的信息,并载入图片。
 
        $this->waterImg_info = getimagesize($this->waterImg);
 
        switch ($this->waterImg_info[2]) {
 
            case 3:
 
                $this->water_im = imagecreatefrompng($this->waterImg);
 
                break 1;
 
            case 2:
 
                $this->water_im = imagecreatefromjpeg($this->waterImg);
 
                break 1;
 
            case 1:
 
                $this->water_im = imagecreatefromgif($this->waterImg);
 
                break 1;
 
            default:
 
                die('水印图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。');
 
        }
 
    }
 
    private function waterpos() { //水印位置算法
 
        switch ($this->pos) {
 
            case 0:     //随机位置
 
                $this->x = rand(0,$this->srcImg_info[0]-$this->waterImg_info[0]);
 
                $this->y = rand(0,$this->srcImg_info[1]-$this->waterImg_info[1]);
 
                break 1;
 
            case 1:     //上左
 
                $this->x = 0;
 
                $this->y = 0;
 
                break 1;
 
            case 2:     //上中
 
                $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
 
                $this->y = 0;
 
                break 1;
 
            case 3:     //上右
 
                $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
 
                $this->y = 0;
 
                break 1;
 
            case 4:     //中左
 
                $this->x = 0;
 
                $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2;
 
                break 1;
 
            case 5:     //中中
 
                $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
 
                $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2;
 
                break 1;
 
            case 6:     //中右
 
                $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
 
                $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2;
 
                break 1;
 
            case 7:     //下左
 
                $this->x = 0;
 
                $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
 
                break 1;
 
            case 8:     //下中
 
                $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
 
                $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
 
                break 1;
 
            default:    //下右
 
                $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
 
                $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
 
                break 1;
 
        }
 
    }
 
 
 
    private function waterimg() {
 
        if ($this->srcImg_info[0] <= $this->waterImg_info[0] || $this->srcImg_info[1] <= $this->waterImg_info[1]){
 
            die('注意:水印比原图大!');
 
        }
 
        $this->waterpos();
 
        $cut = imagecreatetruecolor($this->waterImg_info[0],$this->waterImg_info[1]);
 
        imagecopy($cut,$this->im,0,0,$this->x,$this->y,$this->waterImg_info[0],$this->waterImg_info[1]);
 
        $pct = $this->transparent;
 
        imagecopy($cut,$this->water_im,0,0,0,0,$this->waterImg_info[0],$this->waterImg_info[1]);
 
        imagecopymerge($this->im,$cut,$this->x,$this->y,0,0,$this->waterImg_info[0],$this->waterImg_info[1],$pct);
 
    }
 
 
 
    private function waterstr() {
 
        $rect = imagettfbbox($this->fontSize,0,$this->fontFile,$this->waterStr);
 
        $w = abs($rect[2]-$rect[6]);
 
        $h = abs($rect[3]-$rect[7]);
 
        $fontHeight = $this->fontSize;
 
        $this->water_im = imagecreatetruecolor($w, $h);
 
        imagealphablending($this->water_im,false);
 
        imagesavealpha($this->water_im,true);
 
        $white_alpha = imagecolorallocatealpha($this->water_im,255,255,255,127);
 
        imagefill($this->water_im,0,0,$white_alpha);
 
        $color = imagecolorallocate($this->water_im,$this->fontColor[0],$this->fontColor[1],$this->fontColor[2]);
 
        imagettftext($this->water_im,$this->fontSize,0,0,$this->fontSize,$color,$this->fontFile,$this->waterStr);
 
        $this->waterImg_info = array(0=>$w,1=>$h);
 
        $this->waterimg();
 
    }
 
 
 
    function output() {
 
        $this->imginfo();
 
        if ($this->waterType == 0) {
 
            $this->waterstr();
 
        }else {
 
            $this->waterimginfo();
 
            $this->waterimg();
 
        }
 
        switch ($this->srcImg_info[2]) {
 
            case 3:
 
                imagepng($this->im,$this->srcImg);
 
                break 1;
 
            case 2:
 
                imagejpeg($this->im,$this->srcImg);
 
                break 1;
 
            case 1:
 
                imagegif($this->im,$this->srcImg);
 
                break 1;
 
            default:
 
                die('添加水印失败哦!');
 
                break;
 
        }
 
        imagedestroy($this->im);
 
        imagedestroy($this->water_im);
 
    }
 
}
 
?>

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

6

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

8

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

14

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

17

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

2

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

130

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

8

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

208

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号