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; } }