PHP
·
发表于 5年以前
·
阅读量:8300
±¾ÎÄʵÀý½²ÊoÁËphpͼÏñ´¦ÀiÀa¡£*ÖÏi¸ø´o¼Ò¹(C)´o¼Ò²Î¿¼¡£¾ßÌaÈçÏ£º
<?php
/**
* Image Àa
*/
class Image {
/**
* @var string $fileName ÎļþÃu
* @access private
*/
private $fileName = '';
/**
* @var gd resource $imageResource ÔͼÏñ
* @access private
*/
private $imageResource = NULL;
/**
* @var int $imageWidth ÔͼÏñ¿i
* @access private
*/
private $imageWidth = NULL;
/**
* @var int $imageHeight ÔͼÏñ¸ß
* @access private
*/
private $imageHeight = NULL;
/**
* @var int $imageType ÔͼÏñÀaÐÍ
* @access private
*/
private $imageType = NULL;
/**
* @var int $imageWidth ÔͼÏñ¿i
* @access private
*/
public $width = NULL;
/**
* @var int $imageHeight ÔͼÏñ¸ß
* @access private
*/
public $height = NULL;
/**
* @var int $imageType ÔͼÏñÀaÐÍ
* @access private
*/
public $type = NULL;
/**
* @var int $newResource ÐÂͼÏñ
* @access private
*/
private $newResource = NULL;
/**
* @var int $newResType ÐÂͼÏñÀaÐÍ
* @access private
*/
private $newResType = NULL;
/**
* ¹¹Ôiº¯Êý
* @param string $fileName ÎļþÃu
*/
public function __construct($fileName = NULL) {
$this->fileName = $fileName;
if ($this->fileName) {
$this->getSrcImageInfo();
}
}
/**
* ȡԴͼÏñÐÅÏ¢
* @access private
* @return void
*/
private function getSrcImageInfo() {
$info = $this->getImageInfo();
$this->imageWidth = $info[0];
$this->imageHeight = $info[1];
$this->imageType = $info[2];
$this->width = $info[0];
$this->height = $info[1];
$this->type = $info[2];
}
/**
* ȡͼÏñÐÅÏ¢
* @param string $fileName ÎļþÃu
* @access private
* @return array
*/
private function getImageInfo($fileName = NULL) {
if ($fileName==NULL) {
$fileName = $this->fileName;
}
$info = getimagesize($fileName);
return $info;
}
/**
* ´´½¨Ô´Í¼ÏñGD ×ÊÔ´
* @access private
* @return void
*/
private function createSrcImage () {
$this->imageResource = $this->createImageFromFile();
}
/**
* ¸u¾ÝÎļþ´´½¨Í¼ÏñGD ×ÊÔ´
* @param string $fileName ÎļþÃu
* @return gd resource
*/
public function createImageFromFile($fileName = NULL)
{
if (!$fileName) {
$fileName = $this->fileName;
$imgType = $this->imageType;
}
if (!is_readable($fileName) || !file_exists($fileName)) {
throw new Exception('Unable to open file "' . $fileName . '"');
}
if (!$imgType) {
$imageInfo = $this->getImageInfo($fileName);
$imgType = $imageInfo[2];
}
switch ($imgType) {
case IMAGETYPE_GIF:
$tempResource = imagecreatefromgif($fileName);
break;
case IMAGETYPE_JPEG:
$tempResource = imagecreatefromjpeg($fileName);
break;
case IMAGETYPE_PNG:
$tempResource = imagecreatefrompng($fileName);
break;
case IMAGETYPE_WBMP:
$tempResource = imagecreatefromwbmp($fileName);
break;
case IMAGETYPE_XBM:
$tempResource = imagecreatefromxbm($fileName);
break;
default:
throw new Exception('Unsupport image type');
}
return $tempResource;
}
/**
* ¸Ä±aͼÏñ´oС
* @param int $width ¿i
* @param int $height ¸ß
* @param string $flag Ò»°a¶øÑÔ,ÔÊÐi½ØͼÔoÓÃ4,²»ÔÊÐi½ØͼÔoÓÃ1; ¼ÙÉeÒªÇoÒ»¸oΪ4:3±ÈÀýµÄͼÏñ,Ôo:4=Èç¹uÌ«³¤Ôo×Ô¶¯„h³ýÒ»²¿*Ö 0=³¤¿iת»»³É²ÎÊýÖ¸¶¨µÄ 1=°´±ÈÀýËo*Å,×Ô¶¯ÅжÏÌ«³¤»¹ÊÇÌ«¿i,³¤¿iÔ¼ÊøÔÚ²ÎÊýÖ¸¶¨ÄÚ 2=ÒÔ¿iΪԼÊøËo*Å 3=ÒÔ¸ßΪԼÊøËo*Å
* @param string $bgcolor Èç¹u²»Îªnull,ÔoÓÃÕa¸o²ÎÊýÖ¸¶¨µÄÑÕÉ«×÷Ϊ±³¾°É«,²¢ÇÒͼÏñÀ(C)³aµ½Ö¸¶¨¸ß¿i,¸Ã²ÎÊýÓ¦¸ÃÊÇÒ»¸oÊý×e;
* @return string
*/
public function resizeImage($width, $height, $flag=1, $bgcolor=null) {
$widthRatio = $width/$this->imageWidth;
$heightRatio = $height/$this->imageHeight;
switch ($flag) {
case 1:
if ($this->imageHeight < $height && $this->imageWidth < $width) {
$endWidth = $this->imageWidth;
$endHeight = $this->imageHeight;
//return;
} elseif (($this->imageHeight * $widthRatio)>$height) {
$endWidth = ceil($this->imageWidth * $heightRatio);
$endHeight = $height;
} else {
$endWidth = $width;
$endHeight = ceil($this->imageHeight * $widthRatio);
}
break;
case 2:
$endWidth = $width;
$endHeight = ceil($this->imageHeight * $widthRatio);
break;
case 3:
$endWidth = ceil($this->imageWidth * $heightRatio);
$endHeight = $height;
break;
case 4:
$endWidth2 = $width;
$endHeight2 = $height;
if ($this->imageHeight < $height && $this->imageWidth < $width) {
$endWidth = $this->imageWidth;
$endHeight = $this->imageHeight;
//return;
} elseif (($this->imageHeight * $widthRatio)<$height) {
$endWidth = ceil($this->imageWidth * $heightRatio);
$endHeight = $height;
} else {
$endWidth = $width;
$endHeight = ceil($this->imageHeight * $widthRatio);
}
break;
default:
$endWidth = $width;
$endHeight = $height;
break;
}
if ($this->imageResource==NULL) {
$this->createSrcImage();
}
if($bgcolor){
$this->newResource = imagecreatetruecolor($width,$height);
$bg=ImageColorAllocate($this->newResource,$bgcolor[0],$bgcolor[1],$bgcolor[2]);
ImageFilledRectangle($this->newResource,0,0,$width,$height,$bg);
$tox=ceil(($width-$endWidth)/2);
$toy=ceil(($height-$endHeight)/2);
if($tox<0) $tox=0;
if($toy<0) $toy=0;
}else if ($flag==4) {
$this->newResource = imagecreatetruecolor($endWidth2,$endHeight2);
}else {
$this->newResource = imagecreatetruecolor($endWidth,$endHeight);
}
$this->newResType = $this->imageType;
imagecopyresampled($this->newResource, $this->imageResource, $tox, $toy, 0, 0, $endWidth, $endHeight,$this->imageWidth,$this->imageHeight);
}
/**
* ¸øͼÏñ¼Óˮӡ
* @param string $waterContent ˮӡÄÚÈÝ¿ÉÒÔÊÇͼÏñÎļþÃu£¬Ò²¿ÉÒÔÊÇÎÄ×Ö
* @param int $pos λÖÃ0-9¿ÉÒÔÊÇÊý×e
* @param int $textFont ×ÖÌa´o×Ö£¬µ±Ë®Ó¡ÄÚÈÝÊÇÎÄ×ÖʱÓÐЧ
* @param string $textColor ÎÄ×ÖÑÕÉ«£¬µ±Ë®Ó¡ÄÚÈÝÊÇÎÄ×ÖʱÓÐЧ
* @return string
*/
public function waterMark($waterContent, $pos = 0, $textFont=5, $textColor="#ffffff") {
$isWaterImage = file_exists($waterContent);
if ($isWaterImage) {
$waterImgRes = $this->createImageFromFile($waterContent);
$waterImgInfo = $this->getImageInfo($waterContent);
$waterWidth = $waterImgInfo[0];
$waterHeight = $waterImgInfo[1];
} else {
$waterText = $waterContent;
//$temp = @imagettfbbox(ceil($textFont*2.5),0,"./cour.ttf",$waterContent);
if ($temp) {
$waterWidth = $temp[2]-$temp[6];
$waterHeight = $temp[3]-$temp[7];
} else {
$waterWidth = 100;
$waterHeight = 12;
}
}
if ($this->imageResource==NULL) {
$this->createSrcImage();
}
switch($pos)
{
case 0://Ëae»u
$posX = rand(0,($this->imageWidth - $waterWidth));
$posY = rand(0,($this->imageHeight - $waterHeight));
break;
case 1://1Ϊ¶¥¶Ë¾Ó×o
$posX = 0;
$posY = 0;
break;
case 2://2Ϊ¶¥¶Ë¾ÓÖÐ
$posX = ($this->imageWidth - $waterWidth) / 2;
$posY = 0;
break;
case 3://3Ϊ¶¥¶Ë¾ÓÓÒ
$posX = $this->imageWidth - $waterWidth;
$posY = 0;
break;
case 4://4ΪÖв¿¾Ó×o
$posX = 0;
$posY = ($this->imageHeight - $waterHeight) / 2;
break;
case 5://5ΪÖв¿¾ÓÖÐ
$posX = ($this->imageWidth - $waterWidth) / 2;
$posY = ($this->imageHeight - $waterHeight) / 2;
break;
case 6://6ΪÖв¿¾ÓÓÒ
$posX = $this->imageWidth - $waterWidth;
$posY = ($this->imageHeight - $waterHeight) / 2;
break;
case 7://7Ϊµ×¶Ë¾Ó×o
$posX = 0;
$posY = $this->imageHeight - $waterHeight;
break;
case 8://8Ϊµ×¶Ë¾ÓÖÐ
$posX = ($this->imageWidth - $waterWidth) / 2;
$posY = $this->imageHeight - $waterHeight;
break;
case 9://9Ϊµ×¶Ë¾ÓÓÒ
$posX = $this->imageWidth - $waterWidth-20;
$posY = $this->imageHeight - $waterHeight-10;
break;
default://Ëae»u
$posX = rand(0,($this->imageWidth - $waterWidth));
$posY = rand(0,($this->imageHeight - $waterHeight));
break;
}
imagealphablending($this->imageResource, true);
if($isWaterImage) {
imagecopy($this->imageResource, $waterImgRes, $posX, $posY, 0, 0, $waterWidth,$waterHeight);
} else {
$R = hexdec(substr($textColor,1,2));
$G = hexdec(substr($textColor,3,2));
$B = hexdec(substr($textColor,5));
$textColor = imagecolorallocate($this->imageResource, $R, $G, $B);
imagestring ($this->imageResource, $textFont, $posX, $posY, $waterText, $textColor);
}
$this->newResource = $this->imageResource;
$this->newResType = $this->imageType;
}
/**
* Éu³ÉÑeÖ¤ÂeͼƬ
* @param int $width ¿i
* @param string $height ¸ß
* @param int $length ³¤¶È
* @param int $validType 0=Êý×Ö,1=×Öĸ,2=Êý×Ö¼Ó×Öĸ
* @param string $textColor ÎÄ×ÖÑÕÉ«
* @param string $backgroundColor ±³¾°ÑÕÉ«
* @return void
*/
public function imageValidate($width, $height, $length = 4, $validType = 1, $textColor = '#000000', $backgroundColor = '#ffffff') {
if ($validType==1) {
$validString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$validLength = 52;
} elseif ($validType==2) {
$validString = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$validLength = 62;
} else {
$validString = '123456789';
$validLength = 9;
}
srand((int)time());
$valid = '';
for ($i=0; $i<$length; $i++) {
$valid .= $validString{rand(0, $validLength-1)};
}
$this->newResource = imagecreate($width,$height);
$bgR = hexdec(substr($backgroundColor,1,2));
$bgG = hexdec(substr($backgroundColor,3,2));
$bgB = hexdec(substr($backgroundColor,5,2));
$backgroundColor = imagecolorallocate($this->newResource, $bgR, $bgG, $bgB);
$tR = hexdec(substr($textColor,1,2));
$tG = hexdec(substr($textColor,3,2));
$tB = hexdec(substr($textColor,5,2));
$textColor = imagecolorallocate($this->newResource, $tR, $tG, $tB);
for ($i=0;$i<strlen($valid);$i++){
imagestring($this->newResource,5,$i*$width/$length+3,2, $valid[$i],$textColor);
}
$this->newResType = IMAGETYPE_JPEG;
return $valid;
}
/**
* ÏÔʾÊa³oͼÏñ
* @return void
*/
public function display($fileName='', $quality=100) {
$imgType = $this->newResType;
$imageSrc = $this->newResource;
switch ($imgType) {
case IMAGETYPE_GIF:
if ($fileName=='') {
header('Content-type: image/gif');
}
imagegif($imageSrc, $fileName, $quality);
break;
case IMAGETYPE_JPEG:
if ($fileName=='') {
header('Content-type: image/jpeg');
}
imagejpeg($imageSrc, $fileName, $quality);
break;
case IMAGETYPE_PNG:
if ($fileName=='') {
header('Content-type: image/png');
imagepng($imageSrc);
} else {
imagepng($imageSrc, $fileName);
}
break;
case IMAGETYPE_WBMP:
if ($fileName=='') {
header('Content-type: image/wbmp');
}
imagewbmp($imageSrc, $fileName, $quality);
break;
case IMAGETYPE_XBM:
if ($fileName=='') {
header('Content-type: image/xbm');
}
imagexbm($imageSrc, $fileName, $quality);
break;
default:
throw new Exception('Unsupport image type');
}
imagedestroy($imageSrc);
}
/**
* ±£´aeͼÏñ
* @param int $fileNameType ÎļþÃuÀaÐÍ 0ʹÓÃÔÎļþÃu£¬1ʹÓÃÖ¸¶¨µÄÎļþÃu£¬2ÔÚÔÎļþÃu¼ÓÉϺo׺£¬3²uÉuËae»uÎļþÃu
* @param string $folder Îļþ¼ÐÂ*¾¶ Ϊ¿ÕΪÓeÔÎļþÏaͬ
* @param string $param ²ÎÊý$fileNameTypeΪ1ʱΪÎļþÃu2ʱΪºo׺
* @return void
*/
public function save($fileNameType = 0, $folder = NULL, $param = '_miniature') {
if ($folder==NULL) {
$folder = dirname($this->fileName).DIRECTORY_SEPARATOR;
}
$fileExtName = FileSystem::fileExt($this->fileName, true);
$fileBesicName = FileSystem::getBasicName($this->fileName, false);
switch ($fileNameType) {
case 1:
$newFileName = $folder.$param;
break;
case 2:
$newFileName = $folder.$fileBesicName.$param.$fileExtName;
break;
case 3:
$tmp = date('YmdHis');
$fileBesicName = $tmp;
$i = 0;
while (file_exists($folder.$fileBesicName.$fileExtName)) {
$fileBesicName = $tmp.$i;
$i++;
}
$newFileName = $folder.$fileBesicName.$fileExtName;
break;
default:
$newFileName = $this->fileName;
break;
}
$this->display($newFileName);
return $newFileName;
}
}
?>
Ï£Íu±¾ÎÄËuÊo¶Ô´o¼ÒµÄphp³ÌÐoÉe¼ÆÓÐËu°iÖu¡£