PHP圖片水印類的封裝
更新時(shí)間:2017年07月06日 09:38:13 作者:東東東蔚
這篇文章主要為大家詳細(xì)介紹了PHP圖片水印類的封裝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
封裝PHP的圖片水印的類,供大家參考,具體內(nèi)容如下
<?php
header('Content-type:text/html;charset=utf8');
$img = new Image();
// $img->water('2a.jpg','logo.gif',0);
class Image{
//路徑
protected $path;
//是否啟用隨機(jī)名字
protected $isRandName;
//要保存的圖像類型
protected $type;
//通過(guò)構(gòu)造方法隊(duì)成員屬性進(jìn)行初始化
function __construct($path='./',$isRandName=true,$type='png'){
$this->path = $path;
$this->isRandName = $isRandName;
$this->type = $type;
}
//對(duì)外公開(kāi)的水印方法
/**
* @param char $image 原圖
* @param char $water 水印圖片
* @param char $postion 位置
* @param int $tmp 透明度
* @param char $prefix 前綴
*/
function water($image,$water,$postion,$tmp=100,$prefix='water_'){
//判斷這兩個(gè)圖片是否存在
if(!file_exists($image)||!file_exists($water)){
die('圖片資源不存在');
}
//得到原圖和水印圖片的寬高
$imageInfo = self::getImageInfo($image);
$waterInfo = self::getImageInfo($water);
//判斷水印圖片是否能貼上來(lái)
if (!$this->checkImage($imageInfo,$waterInfo)){
die('水印圖片太大');
}
//打開(kāi)圖片
$imageRes = self::openAnyImage($image);
$waterRes = self::openAnyImage($water);
//根據(jù)水印圖片的位置計(jì)算水印圖片的坐標(biāo)
$pos = $this->getPosition($postion,$imageInfo,$waterInfo);
//將水印圖片貼過(guò)來(lái)
imagecopymerge($imageRes, $waterRes, $pos['x'], $pos['y'], 0, 0, $waterInfo["width"], $waterInfo["height"], $tmp);
//得到要保存圖片的文件名
$newName = $this->createNewName($image,$prefix);
//得到保存圖片的路徑,也就是文件的全路徑
$newPath = rtrim($this->path,'/').'/'.$newName;
//保存圖片
$this->saveImage($imageRes,$newPath);
//銷毀資源
imagedestroy($imageRes);
imagedestroy($waterRes);
//返回路徑
return $newPath;
}
//保存圖像資源
protected function saveImage($imageRes,$newPath){
$func = 'image'.$this->type;
//通過(guò)變量函數(shù)進(jìn)行保存
$func($imageRes,$newPath);
}
//得到文件名函數(shù)
protected function createNewName($imagePath,$prefix){
if ($this->isRandName){
$name = $prefix.uniqid().'.'.$this->type;
}else {
$name = $prefix.pathinfo($imagePath)['filename'].'.'.$this->type;
}
return $name;
}
//根據(jù)位置計(jì)算水印圖片的坐標(biāo)
protected function getPosition($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];
}
protected function checkImage($imageInfo,$waterInfo){
if (($waterInfo['width'] > $imageInfo['width'])||($waterInfo['height'] > $imageInfo['height'])){
return false;
}
return true;
}
//靜態(tài)方法。根據(jù)圖片的路徑得到圖片的信息,寬度,高度、mime類型
static function getImageInfo($imagePath){
$info = getimagesize($imagePath);
$data['width']=$info[0];
$data['height']=$info[1];
$data['mime'] = $info['mime'];
return $data;
}
static function openAnyImage($imagePath){
//得到圖像的mime類型
$mime = self::getImageInfo($imagePath)['mime'];
//根據(jù)不同的mime類型打開(kāi)不同的圖像
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ī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
php的array數(shù)組和使用實(shí)例簡(jiǎn)明教程(容易理解)
最近在教一個(gè)朋友php,他沒(méi)有其他語(yǔ)言的基礎(chǔ)。對(duì)array的理解和用法有些模糊。所以寫(xiě)了個(gè)教程,需要的朋友可以參考下2014-03-03
基于php在各種web服務(wù)器的運(yùn)行模式詳解
本篇文章是對(duì)php在各種web服務(wù)器的運(yùn)行模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php創(chuàng)建多級(jí)目錄完整封裝類操作方法
下面小編就為大家?guī)?lái)一篇php創(chuàng)建多級(jí)目錄完整封裝類操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
安裝PHP擴(kuò)展時(shí)解壓官方 tgz 文件后沒(méi)有configure文件無(wú)法進(jìn)行配置編譯的問(wèn)題
這篇文章主要介紹了安裝PHP擴(kuò)展時(shí)解壓官方 tgz 文件后沒(méi)有configure文件無(wú)法進(jìn)行配置編譯的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-08-08
phpcms手機(jī)內(nèi)容頁(yè)面添加上一篇和下一篇
本文給大家分享的是在phpcms中的手機(jī)內(nèi)容詳情頁(yè)里添加上一篇和下一篇的方法,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
2015-06-06 
