PHP Class - 图片水印
生活随笔
收集整理的這篇文章主要介紹了
PHP Class - 图片水印
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
類文件
<?php$image = new WaterMark(); // $path = $image->imgWater('./upload/bg1.jpg','./upload/w1.png',0,40); // echo $path; $image->textWater('./upload/bg1.jpg', 'ABCDEFG', 0, 23, [255,255,255]);/*** @Purpose: 圖像加圖片水印* imgWater 圖像水印* textWater 文字水印*/ class WaterMark { // 保存圖像的路徑protected $path;// 是否隨機(jī)名字protected $isRandName;// 保存圖像的類型protected $type;function __construct($path = './image/', $isRandName = true, $type = 'png'){$this->path = $path;$this->isRandName = $isRandName;$this->type = $type;}// 生成圖片水印 $image 原圖片 $water水印圖片 $position水印位置 $tmd透明度 $prefix前綴public function imgWater($image, $water, $position, $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 計算水印坐標(biāo)$pos = $this->getPosition($position, $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;}// 生成文字水印 $image原圖片 $text文字 $position水印位置 $fontsize文字尺寸 $prefix前綴public function textWater($image, $text, $position, $fontsize=13, $fontColor=[0,0,0], $prefix = 'water_'){$font = './upload/arial.ttf';//字體// 1. 判斷兩圖片是否存在if((!file_exists($image))){die('圖片資源不存在');}// 2. 得到圖片信息$imageInfo = self::getImageInfo($image);// 3. 得到文字寬高$textInfo = imagettfbbox ( $fontsize, 0, $font, $text);$texth = abs($textInfo[1]-$textInfo[7]);$textw = abs($textInfo[2]-$textInfo[0]);$waterInfo['width'] = $textw;$waterInfo['height'] = $texth;// 4. 水印圖片寬高是否大于原圖if(!$this->checkImage($imageInfo, $waterInfo)){exit('水印文字太大');}// 5. 打開圖片$imageRes = self::openAnyImage($image);// 6 字體顏色$black = imagecolorallocate($imageRes, $fontColor[0], $fontColor[1], $fontColor[2]);// 7. 計算水印位置$pos = $this->getPosition($position, $imageInfo, $waterInfo);// 8. 文字寫入圖像imagefttext($imageRes, $fontsize, 0, $pos['x'], $pos['y']+$texth, $black, $font, $text);// 9. 保存圖片的文件名$newName = $this->createNewName($image, $prefix);// 10. 保存圖片的路徑$newPath = rtrim($this->path, '/').'/'.$newName;// 11. 保存圖片$this->saveImage($imageRes, $newPath);// 12. 銷毀圖像imagedestroy($imageRes);}// 根據(jù)圖片路徑得到圖片信息(寬, 高, mime)static function getImageInfo($imagePath){$info = getimagesize($imagePath);$data['width'] = $info[0];$data['height'] = $info[1];$data['mime'] = $info['mime'];return $data;}// 檢查水印圖片大小是否大于原圖protected function checkImage($imageInfo, $waterInfo){if(($waterInfo['width']>$imageInfo['width']) || ($waterInfo['height']>$imageInfo['height'])){return false;}return true;}// 根據(jù)圖片類型打開圖片static function openAnyImage($imagePath){// 圖像的mime$mime = self::getImageInfo($imagePath)['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;}// 根據(jù)位置計算水印坐標(biāo)protected function getPosition($position, $imageInfo, $waterInfo){switch ($position) {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];}// 創(chuàng)建新名字protected function createNewName($imagePath, $prefix){if($this->isRandName){$name = $prefix . uniqid().'.'.$this->type;}else{$name = $prefix . pathinfo($imagePath)['filename'].'.'.$this->type;}return $name;}// 保存圖片protected function saveImage($imageRes, $newPath){if(!$this->check()){die('目錄不存在');}$func = 'image'.$this->type;$func($imageRes, $newPath);}// 檢測創(chuàng)建文件夾, 檢測文件是否可寫protected function check(){// 文件夾不存在或不是目錄,創(chuàng)建if(!file_exists($this->path) || !is_dir($this->path)){return mkdir($this->path, 0777, true);}// 判斷文件是否可寫if(!is_writeable($this->path)){return chmod($this->path, 0777);}return true;}}總結(jié)
以上是生活随笔為你收集整理的PHP Class - 图片水印的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML绘制太极八卦图
- 下一篇: 英文视频添加中英双语字幕(基于Whisp