PHP 图片处理,生成缩略图、圆形图片

<?php 

/*

* name:娄喜贺

*/

class MyUpload{

var $saveName;// 保存名

var $tmpPath;// 临时保存路径

var $savePath;// 保存路径

var $fileFormat = array('gif','jpg','png','doc','application/octet-stream');// 文件格式&MIME限定

var $overwrite = 0;// 覆盖模式

var $maxSize = 0;// 文件最大字节

var $ext;// 文件扩展名

var $thumb = 0;// 是否生成缩略图

var $thumbWidth = 130;// 缩略图宽

var $thumbHeight = 130;// 缩略图高

var $thumbPrefix = "thumb_";// 缩略图前缀

var $errno;// 错误代号

var $returnArray= array();// 所有文件的返回信息s

var $returninfo= array();// 每个文件返回信息

var $thumbArray = array();//生成多个缩略图

var $_radius;// 圆形图半径

var $round;// 设置是否生成圆形图,1:是、0:否

var $roundArray;// 处理圆形图多个尺寸


//构造函数

// @param tmpPath 文件保存路径

// @param fileFormat 文件格式限制数组

// @param maxSize 文件最大尺寸

// @param overwriet 是否覆盖 1 允许覆盖 0 禁止覆盖


function MyUpload($params) {

$tmpPath = $params['tmpPath'];

$savePath = $params['savePath'];

$fileFormat = isset($params['fileFormat']) ? $params['fileFormat'] : '';

$maxSize = isset($params['maxSize']) ? $params['maxSize'] : 0;

$overwrite = isset($params['overwrite']) ? $params['overwrite'] : 0;

$this->setSavepath($tmpPath,$savePath);

$this->setFileformat($fileFormat);

$this->setMaxsize($maxSize);

$this->setOverwrite($overwrite);

$this->setThumb($this->thumb, $this->thumbWidth,$this->thumbHeight);

$this->errno = 0;

}


// 上传

function run($fileInput,$changeName = 1){

if(isset($_FILES[$fileInput])){

$fileArr = $_FILES[$fileInput];

if(is_array($fileArr['name'])){//上传同文件域名称多个文件

for($i = 0; $i < count($fileArr['name']); $i++){

$ar['tmp_name'] = $fileArr['tmp_name'][$i];

$ar['name'] = $fileArr['name'][$i];

$ar['type'] = $fileArr['type'][$i];

$ar['size'] = $fileArr['size'][$i];

$ar['error'] = $fileArr['error'][$i];

$this->getExt($ar['name']);//取得扩展名,赋给$this->ext,下次循环会更新

$this->setSavename($changeName == 1 ? '' : $ar['name']);//设置保存文件名

if($this->copyfile($ar)){

$this->returnArray[] =   $this->returninfo;

}else{

$this->returninfo['error'] = $this->errmsg();

$this->returnArray[] =   $this->returninfo;

}

}

return $this->errno ?   false :   true;

}else{//上传单个文件

$this->getExt($fileArr['name']);//取得扩展名

$this->setSavename($changeName == 1 ? '' : $fileArr['name']);//设置保存文件名

if($this->copyfile($fileArr)){

$this->returnArray[] =   $this->returninfo;

}else{

$this->returninfo['error'] = $this->errmsg();

$this->returnArray[] =   $this->returninfo;

}

return $this->errno ?   false :   true;

}

return false;

}else{

$this->errno = 10;

return false;

}

}


// 单个文件上传

function copyfile($fileArray){

$this->returninfo = array();

// 返回信息

$this->returninfo['name'] = $fileArray['name'];

$this->returninfo['saveName'] = $this->saveName;

$this->returninfo['size'] = number_format( ($fileArray['size'])/1024 , 0, '.', ' ');//以KB为单位

$this->returninfo['type'] = $fileArray['type'];

$this->returninfo['tmpPath'] = $this->tmpPath;

$this->returninfo['savePath'] = $this->savePath;

// 检查文件格式

if (!$this->validateFormat()){

$this->errno = 11;

return false;

}

// 检查目录是否可写

if(!@is_writable($this->tmpPath)){

$this->errno = 12;

return false;

}

// 如果不允许覆盖,检查文件是否已经存在

if($this->overwrite == 0 && @file_exists($this->tmpPath.$fileArray['name'])){

$this->errno = 13;

return false;

}

// 如果有大小限制,检查文件是否超过限制

if ($this->maxSize != 0 ){

if ($fileArray["size"] > $this->maxSize){

$this->errno = 14;

return false;

}

}

// 文件上传

if(!@copy($fileArray["tmp_name"], $this->tmpPath.$this->saveName)){

$this->errno = $fileArray["error"];

return false;

}else{

if($this->round){

$fielName = $this->_round_it();

$this->_thumb($fielName, $this->roundArray);

}

if($this->thumb){//创建缩略图

$this->_thumb($this->saveName, $this->thumbArray);

}

}

// 删除临时文件

if(!@$this->del($fileArray["tmp_name"])){

return false;

}

return true;

}


// 生成画布对象

function _createFunction($fileName){

$CreateFunction = "p_w_picpathcreatefrom".($this->ext == 'jpg' ? 'jpeg' : $this->ext);

if (strtolower($CreateFunction) == "p_w_picpathcreatefromgif"

&& !function_exists("p_w_picpathcreatefromgif")) {

$this->errno = 16;

return false;

} elseif (strtolower($CreateFunction) == "p_w_picpathcreatefromjpeg"

&& !function_exists("p_w_picpathcreatefromjpeg")) {

$this->errno = 17;

return false;

} elseif (!function_exists($CreateFunction)) {

$this->errno = 18;

return false;

}else{

return @$CreateFunction($this->tmpPath.$fileName);

}

}

// 保存图片

function _saveFunction($createdThumb, $prefix){

$SaveFunction = "p_w_picpath".($this->ext == 'jpg' ? 'jpeg' : $this->ext);

if ( !$SaveFunction($createdThumb,$this->tmpPath.$prefix.$this->saveName) ){

$this->errno = 22; return false;

}else{

return $prefix.$this->saveName;

}

}

//生成圆形图方画

private function _get_lt_rounder_corner() {

$radius = $this->_radius;

$img = p_w_picpathcreatetruecolor($radius, $radius);

$bgcolor = p_w_picpathcolorallocate($img, 255, 255, 255);

$fgcolor = p_w_picpathcolorallocate($img, 0, 0, 0);

p_w_picpathfill($img, 0, 0, $bgcolor);

p_w_picpathfilledarc($img, $radius, $radius, $radius*2, $radius*2, 180, 270, $fgcolor, IMG_ARC_PIE);

p_w_picpathcolortransparent($img, $fgcolor);

return $img;

}


/**

* 生成圆形图

*/

public function _round_it() {

// load the source p_w_picpath

$src_p_w_picpath = $this->_createFunction($this->saveName);

if ($src_p_w_picpath === false) {

die('Sorry, can/t load the p_w_picpath');

}

$p_w_picpath_width = p_w_picpathsx($src_p_w_picpath);

$p_w_picpath_height = p_w_picpathsy($src_p_w_picpath);

if($p_w_picpath_width < $p_w_picpath_height){

$p_w_picpathSize = $p_w_picpath_width;

}else{

$p_w_picpathSize = $p_w_picpath_height;

}


//$p_w_picpathSize = 800;//$p_w_picpath_width;

$this->_radius = (int)$p_w_picpathSize/2;


// create a new p_w_picpath, with src_width, src_height, and fill it with transparent color

$p_w_picpath = p_w_picpathcreatetruecolor($p_w_picpathSize, $p_w_picpathSize);

$trans_color = p_w_picpathcolorallocate($p_w_picpath, 255, 255, 255);

p_w_picpathfill($p_w_picpath, 0, 0, $trans_color);


// then overwirte the source p_w_picpath to the new created p_w_picpath

p_w_picpathcopymerge($p_w_picpath, $src_p_w_picpath, 0, 0, 0, 0, $p_w_picpathSize, $p_w_picpathSize, 100);


// then just copy all the rounded corner p_w_picpaths to the 4 corners

$radius = $this->_radius;

// lt

$lt_corner = $this->_get_lt_rounder_corner();

p_w_picpathcopymerge($p_w_picpath, $lt_corner, 0, 0, 0, 0, $radius, $radius, 100);

// lb

$lb_corner = p_w_picpathrotate($lt_corner, 90, $trans_color);

p_w_picpathcopymerge($p_w_picpath, $lb_corner, 0, $p_w_picpathSize - $radius, 0, 0, $radius, $radius, 100);

// rb

$rb_corner = p_w_picpathrotate($lt_corner, 180, $trans_color);

p_w_picpathcopymerge($p_w_picpath, $rb_corner, $p_w_picpathSize - $radius, $p_w_picpathSize - $radius, 0, 0, $radius, $radius, 100);

// rt

$rt_corner = p_w_picpathrotate($lt_corner, 270, $trans_color);

p_w_picpathcopymerge($p_w_picpath, $rt_corner, $p_w_picpathSize - $radius, 0, 0, 0, $radius, $radius, 100);


// set the transparency

p_w_picpathcolortransparent($p_w_picpath,$trans_color);


return $this->_saveFunction($p_w_picpath, 'round_');

}

// 生成缩略图

function _thumb($fileName, $thumbArray){

//返回值(缩略图)

$Original = $this->_createFunction($fileName);

if (!$Original) {$this->errno = 19; return false;}

$originalHeight = ImageSY($Original);

$originalWidth = ImageSX($Original);


if(!empty($thumbArray)){

foreach($thumbArray as $key => $row){

$this->thumbPrefix = $key;

$this->thumbHeight = $row['height'];

$this->thumbWidth = $row['width'];

//$this->returninfo['']['thumbPrefix'] = $this->thumbPrefix;

$this->returninfo[$this->thumbPrefix] = $this->thumbPrefix.$this->saveName;

if (($originalHeight < $this->thumbHeight

&& $originalWidth < $this->thumbWidth)) {

// 如果比期望的缩略图小,那只Copy


if( $originalHeight > $originalWidth ){// 宽 > 设定宽度

$thumbHeight = $originalHeight;

$thumbWidth = $this->thumbWidth*($originalHeight / $this->thumbWidth);

}else{//高 > 设定高度

$thumbWidth = $this->thumbWidth;

$thumbHeight = $this->thumbHeight*($originalHeight / $this->thumbHeight);

}

} else {

if( $originalWidth > $this->thumbWidth ){// 宽 > 设定宽度

$thumbWidth = $this->thumbWidth ;

$thumbHeight = $this->thumbWidth * ( $originalHeight / $originalWidth );

if($thumbHeight > $this->thumbHeight){//高 > 设定高度

$thumbWidth = $this->thumbHeight * ( $thumbWidth / $thumbHeight );

$thumbHeight = $this->thumbHeight ;

}

}elseif( $originalHeight > $this->thumbHeight ){//高 > 设定高度

$thumbHeight = $this->thumbHeight ;

$thumbWidth = $this->thumbHeight * ( $originalWidth / $originalHeight );

if($thumbWidth > $this->thumbWidth){//宽 > 设定宽度

$thumbHeight = $this->thumbWidth * ( $thumbHeight / $thumbWidth );

$thumbWidth = $this->thumbWidth ;

}

}

if ($thumbWidth == 0) $thumbWidth = 1;

if ($thumbHeight == 0) $thumbHeight = 1;


}

$createdThumb = p_w_picpathcreatetruecolor($this->thumbWidth, $this->thumbHeight);

$color = p_w_picpathcolorallocate($createdThumb,255,255,255);

p_w_picpathfill($createdThumb, 0, 0, $color);


if ( !$createdThumb ) {$this->errno = 20; return false;}

if ( !p_w_picpathcopyresampled($createdThumb, $Original, ($this->thumbWidth - $thumbWidth)/2, ($this->thumbHeight - $thumbHeight)/2, 0, 0,

$thumbWidth, $thumbHeight, $originalWidth, $originalHeight) )

{$this->errno = 21; return false;}

$this->_saveFunction($createdThumb, $this->thumbPrefix);

}

}

}


//------------------------------------------------------------------------

//建目录函数,其中参数$directoryName最后没有"/",

//要是有的话,以'/'打散为数组的时候,最后将会出现一个空值

function makeDirectory($directoryName) {

if(is_dir($directoryName)){

return true;

}

$directoryName = str_replace("\\","/",$directoryName);

$dirNames = explode('/', $directoryName);

$total = count($dirNames) ;

$temp = '';

for($i=0; $i<$total; $i++) {

$temp .= $dirNames[$i].'/';

if (!is_dir($temp)) {

$oldmask = umask(0);

if (!mkdir($temp, 0777)) exit("不能建立目录 $temp");

umask($oldmask);

}

}

return true;

}

//---------------------------------------------------------------------------


// 文件格式检查,MIME检测

function validateFormat(){

if(!is_array($this->fileFormat)

|| in_array(strtolower($this->ext), $this->fileFormat)

|| in_array(strtolower($this->returninfo['type']), $this->fileFormat) )

return true;

else

return false;

}

//获取文件扩展名

function getExt($fileName){

$ext = explode(".", $fileName);

$ext = $ext[count($ext) - 1];

$this->ext = strtolower($ext);

}


//设置上传文件的最大字节限制

// @param $maxSize 文件大小(bytes) 0:表示无限制

function setMaxsize($maxSize){

$this->maxSize = $maxSize;

}

//设置文件格式限定

// @param $fileFormat 文件格式数组

function setFileformat($fileFormat){

if(is_array($fileFormat)){$this->fileFormat = $fileFormat ;}

}


//设置覆盖模式

// @param overwrite 覆盖模式 1:允许覆盖 0:禁止覆盖

function setOverwrite($overwrite){

$this->overwrite = $overwrite;

}




//设置保存路径

// @param $tmpPath 文件保存路径:以 "/" 结尾,若没有 "/",则补上

function setSavepath($tmpPath,$savePath){

$this->tmpPath = substr( str_replace("\\","/", $tmpPath) , -1) == "/"

? $tmpPath : $tmpPath."/";

$this->savePath = substr( str_replace("\\","/", $savePath) , -1) == "/"

? $savePath : $savePath."/";

}


//设置缩略图

// @param $thumb = 1 产生缩略图 $thumbWidth,$thumbHeight 是缩略图的宽和高

function setThumb($thumb, $thumbWidth = 0,$thumbHeight = 0){

$this->thumb = $thumb;

if($thumbWidth) $this->thumbWidth = $thumbWidth;

if($thumbHeight) $this->thumbHeight = $thumbHeight;

}


//设置文件保存名

// @saveName 保存名,如果为空,则系统自动生成一个随机的文件名

function setSavename($saveName){

if ($saveName == ''){   // 如果未设置文件名,则生成一个随机文件名

$name = date('YmdHis')."_".rand(100,999).'.'.$this->ext;

} else {

$name = $saveName;

}

$this->saveName = $name;

}


//删除文件

// @param $file 所要删除的文件名

function del($fileName){

if(!@unlink($fileName)){

$this->errno = 15;

return false;

}

return true;

}


// 返回上传文件的信息

function getInfo(){

return $this->returnArray;

}


// 得到错误信息

function errmsg(){

$uploadClassError = array(

0     =>'文件上传成功 ',

1     =>'The uploaded file exceeds the upload_max_filesize directive in php.ini.',

2     =>'The uploaded file exceeds the MAX_FILE_SIZE that was specified in the HTML form.',

3     =>'The uploaded file was only partially uploaded. ',

4     =>'No file was uploaded. ',

6     =>'Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3. ',

7     =>'Failed to write file to disk. Introduced in PHP 5.1.0. ',

10   =>'Input name is not unavailable!',

11   =>'The uploaded file is Unallowable!',

12   =>'Directory unwritable!',

13   =>'File exist already!',

14   =>'File is too big!',

15   =>'Delete file unsuccessfully!',

16   =>'Your version of PHP does not appear to have GIF thumbnailing support.',

17   =>'Your version of PHP does not appear to have JPEG thumbnailing support.',

18   =>'Your version of PHP does not appear to have pictures thumbnailing support.',

19   =>'An error occurred while attempting to copy the source p_w_picpath .

                     Your version of php ('.phpversion().') may not have this p_w_picpath type support.',

20   =>'An error occurred while attempting to create a new p_w_picpath.',

21   =>'An error occurred while copying the source p_w_picpath to the thumbnail p_w_picpath.',

22   =>'An error occurred while saving the thumbnail p_w_picpath to the filesystem.

                     Are you sure that PHP has been configured with both read and write access on this folder?',

);

if ($this->errno == 0)

return false;

else

return $uploadClassError[$this->errno];

}

}

/**

* 调用上传图片类

* 上传图片

* Enter description here ...

* @param $inputFile表单中上传文件输入框input的名字

* @param $thumb设置是否生成缩略图,1:是,0:否

* @param $thumbWidth缩略图宽,单位是像素(px),留空则使用默认值 130

* @param $thumbHeight缩略图高,单位是像素(px),留空则使用默认值 130

* @param $thumbPrefix缩略图前缀,没有设置则使用默认值 thumb_

*/

public function _uploadImg($inputFile){

$savePath = UPLOADIMGPATH.date('Y',time()).'/'.date('m',time()).'/'.date('d',time());

$tmpPath = TMPIMGPATH.date('Y',time()).'/'.date('m',time()).'/'.date('d',time());

$params['savePath'] = $savePath;

$params['tmpPath'] = $tmpPath;

$this->load->library('myupload',$params);

$this->myupload->setThumb(1); // 设置是否生成缩略图

$this->myupload->round = 1; // 设置是否生成圆形图


//生成多个缩略图

        $this->myupload->thumbArray = array('thumb_'=>array('width'=>76,'height'=>76));

//圆形图生成缩略图尺寸

$this->myupload->roundArray = array('round_pro_'=>array('width'=>76,'height'=>76));

//创建目录

        $this->myupload->makeDirectory($savePath); // 保存目录

        $this->myupload->makeDirectory($tmpPath); // 临时目录

    

        

        //参数中的uploadinput是表单中上传文件输入框input的名字

        //后面的0表示不更改文件名,若为1,则由系统生成随机文件名

        $this->myupload->run($inputFile,1);

//获取上传结果

        return $this->myupload->getInfo();

}

?>