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; } }
上一篇: 李隆基最爱的女人是谁?真的是武惠妃吗?
下一篇: 面向对象总结