PHP利用GD库给图片添加水印

简介: 利用GD库给图片添加水印
/*
 * 添加水印
 * $imgSrc:目标图片,可带相对目录地址,
 * $markImg:水印图片,可带相对目录地址,支持PNG和GIF两种格式,如水印图片在执行文件mark目录下,可写成:mark/mark.gif
 * $markPos:图片水印添加的位置,取值范围:0~9
 * 0:循环平铺水印
 * 1:顶部居左 2:顶部居中 3:顶部居右 4:左边居中
 * 5:图片中心 6:右边居中 7:底部居左 8:底部居中 9:底部居右
 * */
protected static function addWatermark($imgSrc, $markImg, $markPos = 0)
{
    //如果图片不存在或者logo不存在则不处理
    if (!file_exists($imgSrc) || !file_exists($markImg)) {

        return [
            'status' => false,
            'message' => '目标图片或水印图片不存在!'
        ];
    }
    //获取图、水印 宽高类型
    list($srcImg_w, $srcImg_h, $srcImg_t) = getimagesize($imgSrc);
    list($markImg_w, $markImg_h, $markImg_t) = getimagesize($markImg);

    if ($srcImg_w < $markImg_w || $srcImg_h < $markImg_h) {

        return [
            'status' => false,
            'message' => '水印图片尺寸不能大于目标图片尺寸!'
        ];
    }

    switch ($srcImg_t) {

        case 1:
            $srcim = imagecreatefromgif($imgSrc);
            break;
        case 2:
            $srcim = imagecreatefromjpeg($imgSrc);
            break;
        case 3:
            $srcim = imagecreatefrompng($imgSrc);
            break;
        default:
            return [
                'status' => false,
                'message' => '不支持的图片文件类型!'
            ];
    }

    switch ($markImg_t) {

        case 1:
            $markim = imagecreatefromgif($markImg);
            break;
        case 2:
            $markim = imagecreatefromjpeg($markImg);
            break;
        case 3:
            $markim = imagecreatefrompng($markImg);
            break;
        default:
            return [
                'status' => false,
                'message' => '不支持的图片文件类型!'
            ];
    }

    $logow = $markImg_w;
    $logoh = $markImg_h;

    $dst_img = imagecreatetruecolor($srcImg_w, $srcImg_h);

    imagecopy($dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h);

    imagedestroy($srcim);

    if ($markPos) {
        //图片水印添加的位置
        switch ($markPos) {

            case 1:
                $x = +5;
                $y = +5;
                break;
            case 2:
                $x = ($srcImg_w - $logow) / 2;
                $y = +5;
                break;
            case 3:
                $x = $srcImg_w - $logow - 5;
                $y = +15;
                break;
            case 4:
                $x = +5;
                $y = ($srcImg_h - $logoh) / 2;
                break;
            case 5:
                $x = ($srcImg_w - $logow) / 2;
                $y = ($srcImg_h - $logoh) / 2;
                break;
            case 6:
                $x = $srcImg_w - $logow - 5;
                $y = ($srcImg_h - $logoh) / 2;
                break;
            case 7:
                $x = +5;
                $y = $srcImg_h - $logoh - 5;
                break;
            case 8:
                $x = ($srcImg_w - $logow) / 2;
                $y = $srcImg_h - $logoh - 5;
                break;
            case 9:
                $x = $srcImg_w - $logow - 5;
                $y = $srcImg_h - $logoh - 5;
                break;
            default:
                return [
                    'status' => false,
                    'message' => '此位置不支持!'
                ];
        }

        imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh);

    } else {
        //循环平铺水印
        for ($x = 0; $x < $srcImg_w; $x++) {
            for ($y = 0; $y < $srcImg_h; $y++) {
                imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh);
                $y += $logoh;
            }
            $x += $logow;
        }
    }

    imagedestroy($markim);

    switch ($srcImg_t) {

        case 1:
            $status = imagegif($dst_img, $imgSrc);
            break;
        case 2:
            $status = imagejpeg($dst_img, $imgSrc);
            break;
        case 3:
            $status = imagepng($dst_img, $imgSrc);
            break;
        default:
            $status = false;
    }

    imagedestroy($dst_img);

    if ($status) {
        $res = [
            'status' => true,
            'message' => '添加水印图片成功!'
        ];
    } else {
        $res = [
            'status' => false,
            'message' => '添加水印图片失败!'
        ];
    }

    return $res;
}
目录
相关文章
|
4月前
|
JavaScript Linux PHP
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
169 3
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
|
7月前
|
PHP
基于PHP开发的资源库系统源码
基于PHP开发的资源库系统源码
169 13
|
7月前
|
Linux PHP iOS开发
PHP-Raylib 视 频 游 戏 编 程 库
php-raylib 是基于 PHP-FFI 绑定的 raylib-v5.5 游戏开发库,让 PHP 开发者轻松实现视频游戏编程。相比仅支持 4.+ 版本的原库,本项目适配最新 5.5 版本,并提供友好文档与示例代码(如窗口初始化、文本绘制等)。支持 PHP 7.4+ 和多平台(Windows、Linux、macOS),可通过 Composer 快速安装。欢迎贡献和完善![查看文档](http://raylib.kllxs.top/) 或访问仓库(GitHub/Gitee/Gitcode)。
PHP-Raylib 视 频 游 戏 编 程 库
|
8月前
|
JSON API Go
基于责任链与策略模式的轻量级PHP日志库设计
项目日志乱成一团,bug 时好时坏,服务器问题难以复现?我写了个 PHP 日志系统,第一时间发现问题,避免跑路。实现了责任链模式+策略模式,让日志存储更灵活,支持多种输出方式。
|
9月前
|
监控 定位技术 PHP
使用PHP接入纯真IP库:实现IP地址地理位置查询
本文介绍了如何使用PHP接入纯真IP库(QQWry),实现IP地址的地理位置查询。纯真IP库是一个轻量级的IP数据库,数据格式简单,查询速度快,适合Web应用。首先,下载并放置`QQWry.dat`文件到项目目录。接着,通过编写PHP类解析该文件,实现IP查询功能。最后,提供了一个完整的案例演示,展示如何查询IP地址对应的国家和地区信息。该工具适用于用户地理位置分析、访问日志分析和风控系统等场景,具有轻量级、查询速度快、数据更新方便等优点。
|
11月前
|
PHP 计算机视觉 UED
Buzz库:PHP图像处理中的异步图像下载和保存
Buzz库:PHP图像处理中的异步图像下载和保存
|
12月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
577 4
|
PHP 计算机视觉 开发者
PHP中的图像处理:GD库与Imagick的应用比较
在PHP开发中,图像处理是一个常见的需求,尤其是在开发图像生成、编辑、缩放等功能时。PHP提供了两种主流的图像处理库——GD库和Imagick,它们各自具有不同的特点和适用场景。本文将对这两者进行比较,帮助开发者根据项目需求选择合适的图像处理工具。
|
Shell 网络安全 数据安全/隐私保护
suuk-s.php.jpg-python 库劫持
suuk-s.php.jpg-python 库劫持
88 0
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。