php將圖片保存為不同尺寸圖片的圖片類實(shí)例
來源:易賢網(wǎng) 閱讀:771 次 日期:2015-04-03 10:39:53
溫馨提示:易賢網(wǎng)小編為您整理了“php將圖片保存為不同尺寸圖片的圖片類實(shí)例”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了php將圖片保存為不同尺寸圖片的圖片類,涉及php圖片操作的保存、復(fù)制、縮略圖等常用技巧,并封裝成一個(gè)類文件以便于調(diào)用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了php將圖片保存為不同規(guī)格的圖片類。分享給大家供大家參考。具體如下:

圖片處理類.imagecls.php如下:

/**

圖片處理類

*/

class imagecls

{

/**

* 文件信息

*/

var $file = array();

/**

* 保存目錄

*/

var $dir = '';

/**

* 錯(cuò)誤代碼

*/

var $error_code = 0;

/**

* 文件上傳最大KB

*/

var $max_size = -1;

function es_imagecls()

{

}

private function checkSize($size)

{

return !($size > $this->max_size) || (-1 == $this->max_size);

}

/**

* 處理上傳文件

* @param array $file 上傳的文件

* @param string $dir 保存的目錄

* @return bool

*/

function init($file, $dir = 'temp')

{

if(!is_array($file) || empty($file) || !$this->isUploadFile($file['tmp_name']) || trim($file['name']) == '' || $file['size'] == 0)

{

$this->file = array();

$this->error_code = -1;

return false;

}

else

{

$file['size'] = intval($file['size']);

$file['name'] = trim($file['name']);

$file['thumb'] = '';

$file['ext'] = $this->fileExt($file['name']);

$file['name'] = htmlspecialchars($file['name'], ENT_QUOTES);

$file['is_image'] = $this->isImageExt($file['ext']);

$file['file_dir'] = $this->getTargetDir($dir);

$file['prefix'] = md5(microtime(true)).rand(10,99);

$file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //相對(duì)

$file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //物理

$this->file = &$file;

$this->error_code = 0;

return true;

}

}

/**

* 保存文件

* @return bool

*/

function save()

{

if(empty($this->file) || empty($this->file['tmp_name']))

$this->error_code = -101;

elseif(!$this->checkSize($this->file['size']))

$this->error_code = -105;

elseif(!$this->file['is_image'])

$this->error_code = -102;

elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target']))

$this->error_code = -103;

elseif($this->file['is_image'] && (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))

{

$this->error_code = -104;

@unlink($this->file['local_target']);

}

else

{

$this->error_code = 0;

return true;

}

return false;

}

/**

* 獲取錯(cuò)誤代碼

* @return number

*/

function error()

{

return $this->error_code;

}

/**

* 獲取文件擴(kuò)展名

* @return string

*/

function fileExt($file_name)

{

return addslashes(strtolower(substr(strrchr($file_name, '.'), 1, 10)));

}

/**

* 根據(jù)擴(kuò)展名判斷文件是否為圖像

* @param string $ext 擴(kuò)展名

* @return bool

*/

function isImageExt($ext)

{

static $img_ext = array('jpg', 'jpeg', 'png', 'bmp','gif','giff');

return in_array($ext, $img_ext) ? 1 : 0;

}

/**

* 獲取圖像信息

* @param string $target 文件路徑

* @return mixed

*/

function getImageInfo($target)

{

$ext = es_imagecls::fileExt($target);

$is_image = es_imagecls::isImageExt($ext);

if(!$is_image)

return false;

elseif(!is_readable($target))

return false;

elseif($image_info = @getimagesize($target))

{

list($width, $height, $type) = !empty($image_info) ? $image_info : array('', '', '');

$size = $width * $height;

if($is_image && !in_array($type, array(1,2,3,6,13)))

return false;

$image_info['type'] = strtolower(substr(image_type_to_extension($image_info[2]),1));

return $image_info;

}

else

return false;

}

/**

* 獲取是否充許上傳文件

* @param string $source 文件路徑

* @return bool

*/

function isUploadFile($source)

{

return $source && ($source != 'none') && (is_uploaded_file($source) || is_uploaded_file(str_replace('', '', $source)));

}

/**

* 獲取保存的路徑

* @param string $dir 指定的保存目錄

* @return string

*/

function getTargetDir($dir)

{

if (!is_dir(APP_ROOT_PATH."public/".$dir)) {

@mkdir(APP_ROOT_PATH."public/".$dir);

@chmod(APP_ROOT_PATH."public/".$dir, 0777);

}

return $dir;

}

/**

* 保存文件

* @param string $source 源文件路徑

* @param string $target 目錄文件路徑

* @return bool

*/

private function saveFile($source, $target)

{

if(!es_imagecls::isUploadFile($source))

$succeed = false;

elseif(@copy($source, $target))

$succeed = true;

elseif(function_exists('move_uploaded_file') && @move_uploaded_file($source, $target))

$succeed = true;

elseif (@is_readable($source) && (@$fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')))

{

while (!feof($fp_s))

{

$s = @fread($fp_s, 1024 * 512);

@fwrite($fp_t, $s);

}

fclose($fp_s);

fclose($fp_t);

$succeed = true;

}

if($succeed)

{

$this->error_code = 0;

@chmod($target, 0644);

@unlink($source);

}

else

{

$this->error_code = 0;

}

return $succeed;

}

public function thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,$interlace=true,$filepath = '',$is_preview = true)

{

$info = es_imagecls::getImageInfo($image);

if($info !== false)

{

$srcWidth = $info[0];

$srcHeight = $info[1];

$type = $info['type'];

$interlace = $interlace? 1:0;

unset($info);

if($maxWidth > 0 && $maxHeight > 0)

$scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 計(jì)算縮放比例

elseif($maxWidth == 0)

$scale = $maxHeight/$srcHeight;

elseif($maxHeight == 0)

$scale = $maxWidth/$srcWidth;

$paths = pathinfo($image);

$paths['filename'] = trim(strtolower($paths['basename']),".".strtolower($paths['extension']));

$basefilename = explode("_",$paths['filename']);

$basefilename = $basefilename[0];

if(empty($filepath))

{

if($is_preview)

$thumbname = $paths['dirname'].'/'.$basefilename.'_'.$maxWidth.'x'.$maxHeight.'.jpg';

else

$thumbname = $paths['dirname'].'/'.$basefilename.'o_'.$maxWidth.'x'.$maxHeight.'.jpg';

}

else

$thumbname = $filepath;

$thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);

if($scale >= 1)

{

// 超過原圖大小不再縮略

$width = $srcWidth;

$height = $srcHeight;

if(!$is_preview)

{

//非預(yù)覽模式寫入原圖

file_put_contents($thumbname,file_get_contents($image)); //用原圖寫入

return array('url'=>$thumburl,'path'=>$thumbname);

}

}

else

{

// 縮略圖尺寸

$width = (int)($srcWidth*$scale);

$height = (int)($srcHeight*$scale);

}

if($gen == 1)

{

$width = $maxWidth;

$height = $maxHeight;

}

// 載入原圖

$createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);

if(!function_exists($createFun))

$createFun = 'imagecreatefromjpeg';

$srcImg = $createFun($image);

//創(chuàng)建縮略圖

if($type!='gif' && function_exists('imagecreatetruecolor'))

$thumbImg = imagecreatetruecolor($width, $height);

else

$thumbImg = imagecreate($width, $height);

$x = 0;

$y = 0;

if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

{

$resize_ratio = $maxWidth/$maxHeight;

$src_ratio = $srcWidth/$srcHeight;

if($src_ratio >= $resize_ratio)

{

$x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;

$width = ($height * $srcWidth) / $srcHeight;

}

else

{

$y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;

$height = ($width * $srcHeight) / $srcWidth;

}

}

// 復(fù)制圖片

if(function_exists("imagecopyresampled"))

imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);

else

imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);

if('gif'==$type || 'png'==$type) {

$background_color = imagecolorallocate($thumbImg, 0,255,0); // 指派一個(gè)綠色

imagecolortransparent($thumbImg,$background_color); // 設(shè)置為透明色,若注釋掉該行則輸出綠色的圖

}

// 對(duì)jpeg圖形設(shè)置隔行掃描

if('jpg'==$type || 'jpeg'==$type)

imageinterlace($thumbImg,$interlace);

// 生成圖片

imagejpeg($thumbImg,$thumbname,100);

imagedestroy($thumbImg);

imagedestroy($srcImg);

return array('url'=>$thumburl,'path'=>$thumbname);

}

return false;

}

public function make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,$maxHeight=50,$gen = 0)

{

$interlace = $interlace? 1:0;

if($maxWidth > 0 && $maxHeight > 0)

$scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 計(jì)算縮放比例

elseif($maxWidth == 0)

$scale = $maxHeight/$srcHeight;

elseif($maxHeight == 0)

$scale = $maxWidth/$srcWidth;

if($scale >= 1)

{

// 超過原圖大小不再縮略

$width = $srcWidth;

$height = $srcHeight;

}

else

{

// 縮略圖尺寸

$width = (int)($srcWidth*$scale);

$height = (int)($srcHeight*$scale);

}

if($gen == 1)

{

$width = $maxWidth;

$height = $maxHeight;

}

//創(chuàng)建縮略圖

if($type!='gif' && function_exists('imagecreatetruecolor'))

$thumbImg = imagecreatetruecolor($width, $height);

else

$thumbImg = imagecreatetruecolor($width, $height);

$x = 0;

$y = 0;

if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

{

$resize_ratio = $maxWidth/$maxHeight;

$src_ratio = $srcWidth/$srcHeight;

if($src_ratio >= $resize_ratio)

{

$x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;

$width = ($height * $srcWidth) / $srcHeight;

}

else

{

$y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;

$height = ($width * $srcHeight) / $srcWidth;

}

}

// 復(fù)制圖片

if(function_exists("imagecopyresampled"))

imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);

else

imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);

if('gif'==$type || 'png'==$type) {

$background_color = imagecolorallocate($thumbImg, 255,255,255); // 指派一個(gè)綠色

imagecolortransparent($thumbImg,$background_color); // 設(shè)置為透明色,若注釋掉該行則輸出綠色的圖

}

// 對(duì)jpeg圖形設(shè)置隔行掃描

if('jpg'==$type || 'jpeg'==$type)

imageinterlace($thumbImg,$interlace);

return $thumbImg;

}

public function water($source,$water,$alpha=80,$position="0")

{

//檢查文件是否存在

if(!file_exists($source)||!file_exists($water))

return false;

//圖片信息

$sInfo = es_imagecls::getImageInfo($source);

$wInfo = es_imagecls::getImageInfo($water);

//如果圖片小于水印圖片,不生成圖片

if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1'])

return false;

if(is_animated_gif($source))

{

require_once APP_ROOT_PATH."system/utils/gif_encoder.php";

require_once APP_ROOT_PATH."system/utils/gif_reader.php";

$gif = new GIFReader();

$gif->load($source);

foreach($gif->IMGS['frames'] as $k=>$img)

{

$im = imagecreatefromstring($gif->getgif($k));

//為im加水印

$sImage=$im;

$wCreateFun="imagecreatefrom".$wInfo['type'];

if(!function_exists($wCreateFun))

$wCreateFun = 'imagecreatefromjpeg';

$wImage=$wCreateFun($water);

//設(shè)定圖像的混色模式

imagealphablending($wImage, true);

switch (intval($position))

{

case 0: break;

//左上

case 1:

$posY=0;

$posX=0;

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//右上

case 2:

$posY=0;

$posX=$sInfo[0]-$wInfo[0];

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//左下

case 3:

$posY=$sInfo[1]-$wInfo[1];

$posX=0;

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//右下

case 4:

$posY=$sInfo[1]-$wInfo[1];

$posX=$sInfo[0]-$wInfo[0];

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//居中

case 5:

$posY=$sInfo[1]/2-$wInfo[1]/2;

$posX=$sInfo[0]/2-$wInfo[0]/2;

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

}

//end im加水印

ob_start();

imagegif($sImage);

$content = ob_get_contents();

ob_end_clean();

$frames [ ] = $content;

$framed [ ] = $img['frameDelay'];

}

$gif_maker = new GIFEncoder (

$frames,

$framed,

0,

2,

0, 0, 0,

"bin" //bin為二進(jìn)制 url為地址

);

$image_rs = $gif_maker->GetAnimation ( );

//如果沒有給出保存文件名,默認(rèn)為原圖像名

@unlink($source);

//保存圖像

file_put_contents($source,$image_rs);

return true;

}

//建立圖像

$sCreateFun="imagecreatefrom".$sInfo['type'];

if(!function_exists($sCreateFun))

$sCreateFun = 'imagecreatefromjpeg';

$sImage=$sCreateFun($source);

$wCreateFun="imagecreatefrom".$wInfo['type'];

if(!function_exists($wCreateFun))

$wCreateFun = 'imagecreatefromjpeg';

$wImage=$wCreateFun($water);

//設(shè)定圖像的混色模式

imagealphablending($wImage, true);

switch (intval($position))

{

case 0: break;

//左上

case 1:

$posY=0;

$posX=0;

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//右上

case 2:

$posY=0;

$posX=$sInfo[0]-$wInfo[0];

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//左下

case 3:

$posY=$sInfo[1]-$wInfo[1];

$posX=0;

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//右下

case 4:

$posY=$sInfo[1]-$wInfo[1];

$posX=$sInfo[0]-$wInfo[0];

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

//居中

case 5:

$posY=$sInfo[1]/2-$wInfo[1]/2;

$posX=$sInfo[0]/2-$wInfo[0]/2;

//生成混合圖像

imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

break;

}

//如果沒有給出保存文件名,默認(rèn)為原圖像名

@unlink($source);

//保存圖像

imagejpeg($sImage,$source,100);

imagedestroy($sImage);

}

}

if(!function_exists('image_type_to_extension'))

{

function image_type_to_extension($imagetype)

{

if(empty($imagetype))

return false;

switch($imagetype)

{

case IMAGETYPE_GIF : return '.gif';

case IMAGETYPE_JPEG : return '.jpeg';

case IMAGETYPE_PNG : return '.png';

case IMAGETYPE_SWF : return '.swf';

case IMAGETYPE_PSD : return '.psd';

case IMAGETYPE_BMP : return '.bmp';

case IMAGETYPE_TIFF_II : return '.tiff';

case IMAGETYPE_TIFF_MM : return '.tiff';

case IMAGETYPE_JPC : return '.jpc';

case IMAGETYPE_JP2 : return '.jp2';

case IMAGETYPE_JPX : return '.jpf';

case IMAGETYPE_JB2 : return '.jb2';

case IMAGETYPE_SWC : return '.swc';

case IMAGETYPE_IFF : return '.aiff';

case IMAGETYPE_WBMP : return '.wbmp';

case IMAGETYPE_XBM : return '.xbm';

default : return false;

}

}

}

?>

2.get_spec_img()調(diào)用圖片類,然后再用下面的方法保存不同規(guī)格的圖片并返回圖片連接

//獲取相應(yīng)規(guī)格的圖片地址

//gen=0:保持比例縮放,不剪裁,如高為0,則保證寬度按比例縮放 gen=1:保證長(zhǎng)寬,剪裁

function get_spec_image($img_path,$width=0,$height=0,$gen=0,$is_preview=true)

{

if($width==0)

$new_path = $img_path;

else

{

$img_name = substr($img_path,0,-4);

$img_ext = substr($img_path,-3);

if($is_preview)

$new_path = $img_name."_".$width."x".$height.".jpg";

else

$new_path = $img_name."o_".$width."x".$height.".jpg";

if(!file_exists($new_path))

{

require_once "imagecls.php";

$imagec = new imagecls();

$thumb = $imagec->thumb($img_path,$width,$height,$gen,true,"",$is_preview);

if(app_conf("PUBLIC_DOMAIN_ROOT")!='')

{

$paths = pathinfo($new_path);

$path = str_replace("./","",$paths['dirname']);

$filename = $paths['basename'];

$pathwithoupublic = str_replace("public/","",$path);

$file_data = @file_get_contents($path.$file);

$img = @imagecreatefromstring($file_data);

if($img!==false)

{

$save_path = "public/".$path;

if(!is_dir($save_path))

{

@mk_dir($save_path);

}

@file_put_contents($save_path.$name,$file_data);

}

}

}

}

return $new_path;

}

3.使用方法:

//im:將店鋪圖片保存為3種規(guī)格:小圖:48x48,中圖120x120,大圖200x200

$small_url=get_spec_image($data['image'],48,48,0);

$<span id="result_box" class="short_text" lang="en"><span>middle_url</span></span>=get_spec_image($data['image'],120,120,0);

$big_url=get_spec_image($data['image'],200,200,0);

希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:php將圖片保存為不同尺寸圖片的圖片類實(shí)例
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)