• 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;
        }
    }
  • 相关阅读:
    C++ 值传递、指针传递、引用传递
    typedef与#define的区别
    const与#define的区别
    头文件重复引用
    多态
    ng双向数据绑定
    angular响应式编程
    angular的一些问题
    npm install 权限的问题
    typescript的入门
  • 原文地址:https://www.cnblogs.com/shengChristine/p/10964148.html
Copyright © 2020-2023  润新知