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

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

程序员文章站 2022-07-11 16:17:26
water('./upload/up_5cf0caca0565b.png','./upload/up_5cf0cb3a61fae.jpg',9); class Image { //路径 protected $path; //是否启用随机名字 protected $isRandName; //要保存的... ......
<?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;
    }
}