PHP学习之图像处理-水印类

<?php
$image = new Image();
$image->water('./upload/up_5cf0caca0565b.png','./upload/up_5cf0cb3a61fae.jpg',9);
class Image
{
    //路径
    protected $path;
    //是否启用随机名字
    protected $isRandName;
    //要保存的图像类型
    protected $type;

    //通过构造方法对成员属性进行初始化
    function __construct($path = './', $isRandName = true, $type = 'png')
    {
        $this->path = $path;
        $this->isRandName = $isRandName;
        $this->type = $type;
    }

    /**
     * 对外公开的水印方法
     *
     * @param [type] $image 原图片
     * @param [type] $water 水印图片
     * @param [type] $postion 水印图片的位置
     * @param integer $tmd 水印图片的透明度
     * @param string $prefix 图片的前缀
     * @return void
     */
    function water($image, $water, $postion, $tmd = 100, $prefix = 'water_')
    {
        //1、判断这两个图片是否存在
        if ((!file_exists($image)) || (!file_exists($water))) {
            die('图片资源不存在');
        }
        //2、得到原图片的宽度和高度以及水印图片的宽带和高度
        $imageInfo = self::getImageInfo($image);
        $waterInfo = self::getImageInfo($water);
        //3、判断水印图片能否贴上来
        if (!$this->checkImage($imageInfo, $waterInfo)) {
            exit('水印图片太大');
        }
        //4、打开图片
        $imageRes = self::openAnyImage($image);
        $waterRes = self::openAnyImage($water);
        //5、根据水印图片的位置计算水印图片的坐标
        $pos = $this->getPostion($postion, $imageInfo, $waterInfo);
        //6、将水印图片贴过来
        imagecopymerge($imageRes, $waterRes, $pos['x'], $pos['y'], 0, 0, $waterInfo['width'], $waterInfo['height'], $tmd);
        //7、得到要保存图片的文件名
        $newName = $this->createNewName($image, $prefix);
        //8、得到保存图片的路径,也就是文件的全路径
        $newPath = rtrim($this->path, '/') . '/' . $newName;
        //9、保存图片
        $this->saveImage($imageRes, $newPath);
        //10、销毁资源
        imagedestroy($imageRes);
        imagedestroy($waterRes);
        return $newPath;
    }

    /**
     * 保存图像资源函数
     *
     * @param [type] $imageRes
     * @param [type] $newPath
     * @return void
     */
    protected function saveImage($imageRes, $newPath)
    {
        //imagepng   imagegif   imagewbmp
        $func = 'image' . $this->type;
        //通过变量函数进行保存
        $func($imageRes, $newPath);
    }

    /**
     * 得到文件名函数
     *
     * @param [type] $imagePath
     * @param [type] $prefix
     * @return void
     */
    protected function createNewName($imagePath, $prefix)
    {
        if ($this->isRandName) {
            $name = $prefix . uniqid() . '.' . $this->type;
        } else {
            $name = $prefix . pathinfo($imagePath)['filename'] . '.' . $this->type;
        }
        return $name;
    }

    /**
     * 根据位置计算水印图片的坐标
     *
     * @param [type] $postion
     * @param [type] $imageInfo
     * @param [type] $waterInfo
     * @return void
     */
    protected function getPostion($postion, $imageInfo, $waterInfo)
    {
        switch ($postion) {
            case 1:
                $x = 0;
                $y = 0;
                break;
            case 2:
                $x = ($imageInfo['width'] - $waterInfo['width']) / 2;
                $y = 0;
                break;
            case 3:
                $x = $imageInfo['width'] - $waterInfo['width'];
                $y = 0;
                break;
            case 4:
                $x = 0;
                $y = ($imageInfo['height'] - $waterInfo['height']) / 2;;
                break;
            case 5:
                $x = ($imageInfo['width'] - $waterInfo['width']) / 2;
                $y = ($imageInfo['height'] - $waterInfo['height']) / 2;
                break;
            case 6:
                $x = $imageInfo['width'] - $waterInfo['width'];
                $y = ($imageInfo['height'] - $waterInfo['height']) / 2;
                break;
            case 7:
                $x = 0;
                $y = $imageInfo['height'] - $waterInfo['height'];
                break;
            case 8:
                $x = ($imageInfo['width'] - $waterInfo['width']) / 2;
                $y = $imageInfo['height'] - $waterInfo['height'];
                break;
            case 9:
                $x = $imageInfo['width'] - $waterInfo['width'];
                $y = $imageInfo['height'] - $waterInfo['height'];
                break;
            case 0:
                $x = mt_rand(0, ($imageInfo['width'] - $waterInfo['width']));
                $y = mt_rand(0, ($imageInfo['height'] - $waterInfo['height']));
                break;
        }
        return ['x' => $x, 'y' => $y];
    }

    /**
     * 判断水印图片是否大于原图片
     *
     * @param [type] $imageInfo
     * @param [type] $waterInfo
     * @return void
     */
    protected function checkImage($imageInfo, $waterInfo)
    {
        if (($waterInfo['width'] > $imageInfo['width']) || ($waterInfo['height'] > $imageInfo['height'])) {
            return false;
        }
        return true;
    }

    /**
     * 静态方法,根据图片的路径得到图片信息,宽度、高度、mime类型
     *
     * @param [type] $imagePath
     * @return void
     */
    static function getImageInfo($imagePath)
    {
        //得到图片信息
        $info = getimagesize($imagePath);
        //保存图片宽度
        $data['width'] = $info[0];
        //保存图片高度
        $data['height'] = $info[1];
        //保存图片mime类型
        $data['mime'] = $info['mime'];
        //将图片信息返回
        return $data;
    }

    /**
     * 根据图片类型打开任意图片
     *
     * @param [type] $imagePath
     * @return void
     */
    static function openAnyImage($imagePath)
    {
        //得到图片的mime类型
        $mime = self::getImageInfo($imagePath)['mime'];
        //根据不同的mime类型来使用不同的函数进行打开图片
        switch ($mime) {
            case 'image/png':
                $image = imagecreatefrompng($imagePath);
                break;
            case 'image/gif':
                $image = imagecreatefromgif($imagePath);
                break;
            case 'image/jpeg':
                $image = imagecreatefromjpeg($imagePath);
                break;
            case 'image/wbmp':
                $image = imagecreatefromwbmp($imagePath);
                break;
        }
        return $image;
    }
}