欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP实现九宫格图片水印功能

程序员文章站 2022-05-12 23:06:06
...

WEB开发当中,有时候需要为上传图片添加水印,这样可以有效的保护图片被别人盗用,那么怎么快速为图片添加水印呢?今天,我们就以PHP代码的方式来实现为图片添加水印的效果!
PHP实现九宫格图片水印功能

水印功能类:water.php

代码没有多少复杂的逻辑,主要传入的几个参数见注释,除了需要传入的原始图片和水印图片外,最终合成的图片可以自定义存储路径和名称,如果没有指定保存路径的话,默认以覆盖原始图片的方式进行保存!

<?php

class Water
{
    //导出合成水印的图片
    /*
     * @prama string $image 原始图片
     * @prama string $waterImage 水印图片
     * @prama string $fileName 保存合成水印图片的名称
     * @prama int $pos 水印在原始图片中的位置(九宫格)
     *
     * */

    //入口方法
    public function make(string $image, string $waterImage, string $fileName = null, int $pos = 3)
    {
        $this->checkImage($image);
        $res = $this->resource($image);
        $this->checkImage($waterImage);
        $water = $this->resource($waterImage);
        $position = $this->position($res, $water, $pos);
        imagecopy($res, $water, $position['x'], $position['y'], 0, 0, imagesx($water), imagesy($water));
        return $this->showAction($image)($res, $fileName ?? $image);
    }

    //图片校验
    protected function checkImage(string $image)
    {
        if (!is_file($image) || getimagesize($image) === false) {
            throw new Exception("File is not image");
        }
    }

    //根据图片获取资源
    protected function resource(string $image)
    {
        $info = getimagesize($image);
        $functions = [1 => 'imagecreatefromgif', 2 => 'imagecreatefromjpeg', 3 => 'imagecreatefrompng'];
        $call = $functions[$info[2]];
        return $call($image);
    }

    //渲染图片
    protected function showAction(string $image)
    {
        $info = getimagesize($image);
        $functions = [1 => 'imagegif', 2 => 'imagejpeg', 3 => 'imagepng'];
        return $functions[$info[2]];
    }

    //水印位置
    protected function position($res, $water, int $pos)
    {
        $info = ['x' => 20, 'y' => 20];
        switch ($pos) {
            case 1:
                $info['x'] = (imagesx($res) / 3 - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) / 3 - imagesy($water)) / 2;
                break;
            case 2:
                $info['x'] = (imagesx($res) - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) / 3 - imagesy($water)) / 2;
                break;
            case 3:
                $info['x'] = (imagesx($res) / 3 * 5 - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) / 3 - imagesy($water)) / 2;
                break;
            case 4:
                $info['x'] = (imagesx($res) / 3 - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) - imagesy($water)) / 2;
                break;
            case 5:
                $info['x'] = (imagesx($res) - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) - imagesy($water)) / 2;
                break;
            case 6:
                $info['x'] = (imagesx($res) / 3 * 5 - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) - imagesy($water)) / 2;
                break;
            case 7:
                $info['x'] = (imagesx($res) / 3 - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) / 3 * 5 - imagesy($water)) / 2;
                break;
            case 8:
                $info['x'] = (imagesx($res) - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) / 3 * 5 - imagesy($water)) / 2;
                break;
            case 9:
                $info['x'] = (imagesx($res) / 3 * 5 - imagesx($water)) / 2;
                $info['y'] = (imagesy($res) / 3 * 5 - imagesy($water)) / 2;
                break;
            default:
        }
        return $info;
    }
}
调用:index.php

实例化Water类,通过类对象调用make方法的时候需要传入原始图片、水印图片、合成水印图片的存储名称以及水印的位置(九宫格,默认值为3,即水印在原始图片的右上角)

<?php

include "water.php";
try {
    $water = new Water();
    $water->make('img/003.jpg','img/logo.png',"img/003.jpg",3);
}catch (Exception $e){
    echo $e->getMessage();
}
OK!完成!说不定以后会用到,速度收藏吧!