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;
}
目录
相关文章
|
16天前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
|
1天前
|
PHP
php 生成二维码图片
php 生成二维码图片
4 0
|
14天前
|
Web App开发 Linux PHP
PHP 实现抖音视频去水印播放
该内容主要介绍了如何获取无水印的抖音视频播放地址。原理是通过替换播放地址中的参数来去除水印,首先提供了一个带水印和无水印的播放地址示例。接着,展示了一段PHP代码,该代码通过解析分享链接,获取视频ID,然后利用这些信息通过cURL发送请求,最终得到无水印的播放地址。需要注意的是,由于抖音对PC端的限制,可能需要模拟手机请求来实现。
16 0
|
1月前
|
数据采集 机器学习/深度学习 存储
图片大搜罗:PHP下载器带你畅游Twitter图像海洋
构建Twitter图像下载器,使用PHP模拟请求抓取图像,通过代理IP规避限制。示例代码展示如何设置代理、用户代理和Cookie,解析HTML提取图像链接并下载。结合机器学习与元数据分析,可洞察用户行为和社会趋势。代理服务器信息及Twitter URL需自行替换。
图片大搜罗:PHP下载器带你畅游Twitter图像海洋
|
1月前
|
PHP 数据库
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务-2
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
|
1月前
|
存储 PHP Apache
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务-1
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
|
1月前
|
数据采集 存储 JavaScript
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
|
1月前
|
存储 PHP Apache
使用CFimagehost源码搭建无需数据库支持的PHP免费图片托管私人图床
使用CFimagehost源码搭建无需数据库支持的PHP免费图片托管私人图床