最近在開發上需要使用PHP來產生縮圖,因此在google上搜尋了一下,偶然看到自己舊站發表過一篇自訂尺寸等比例縮圖的文章。(自己都忘了=.=)
不過實測後發現到照著舊文章的code,執行起來似乎有那麼些小bug,那時接觸PHP的時間很短,還很菜。(雖然現在還是很嫩?)
不過說來真是慚愧,那篇文章竟然出現在搜尋結果的第一頁...(好險不是第一筆,不然臉都不知道要往哪裡擺了)
今天就重新寫一個再製版吧~應該會比舊的好一點點吧!
直接進入正文,曬改寫後的code
縮圖類Code
<?php
/**
* 縮圖類
* author:Aidec li
*/
class Thumb
{
public $path;
public $output;
public $width;
public $height;
public $quality = 100;
function __construct()
{
}
/**
* 保存縮圖
* @param $path 原始圖路徑
* @param $output 輸出圖路徑
* @param $width 輸出的寬度
* @param $height 輸出的高度
* @param $quality 輸出的品質
*/
//處理縮圖函式 (路徑,輸出寬度,輸出高度,輸出品質)
public function save($path='',$output='',$width=0,$height=0,$quality=0){
$this->path = ($this->isExist($path)) ? $path : $this->path;
$this->output = ($this->isExist($output)) ? $output : $this->output;
$this->width = ($width>0) ? $width : $this->width;
$this->height = ($height>0) ? $height : $this->height;
$this->quality = ($quality>0) ? $quality : $this->quality;
//檢查參數是否正確
if(!$this->isExist($this->path)){
die('原圖路徑未設定或圖片不存在!');
}
//獲取原圖路徑資訊
$origImageInfo = pathinfo($this->path);
//獲取原始圖的寬高
list($width_o,$height_o)=getimagesize($path);
//若無指定輸出路徑則以原始路徑的檔名+_s
//例如 /path/images/xxx.jpg => /path/images/xxx_s.jpg
if($this->output==''){
$this->output = $origImageInfo['dirname'].'/'.$origImageInfo['filename'].'_s.'.$origImageInfo['extension'];
}
//若無有效的寬度,則以原始寬度
if((int)$this->width<=0){
$this->width = $width_o;
}
//若無有效高度,則以原始高度
if((int)$this->height<=0){
$this->height = $height_o;
}
//判斷原圖片格式副檔名
$ext = $origImageInfo['extension'];
//$img_f=strrchr($path,".");
//對輸出路徑產生對應資料夾
$this->genDir($this->output);
//建立一個自訂寬度、高度的黑色畫布
$image_pic = imagecreatetruecolor($this->width,$this->height);
//判斷副檔名,建立對應的圖像(圖像來源為原始圖片)
switch (strtolower($ext)) {
case 'jpg':
case 'jpeg':
$image=imagecreatefromjpeg($path); break;
case 'png':
$image=imagecreatefrompng($path);
//保留透明度
$color=imagecolorallocate($image_pic,255,255,255);
imagecolortransparent($image_pic,$color);
imagefill($image_pic,0,0,$color);
break;
case 'gif':
$image=imagecreatefromgif($path); break;
default:
die('不支援此圖片格式'); break;
}
//保留透明度
//imagesavealpha($image_pic, true);
//$color = imagecolorallocatealpha($image_pic, 0, 0, 0, 127);
//imagefill($image_pic, 0, 0, $color);
//將圖像複製到另一個圖像(原始圖像 to 新的圖像)
//imagecopyresampled(新目標圖像,原始圖像,目標X起點,目標Y起點,來源X起點,來源Y起點,目標圖像寬度,目標圖像高度,原始圖像寬度,原始圖像高度)
imagecopyresampled($image_pic,$image,0,0,0,0,$this->width,$this->height,$width_o,$height_o);
// start resize (產生縮圖 - 無法處理透明度)
//imagecopyresized($image_pic,$image, 0, 0, 0, 0, $width,$height,$width_o,$height_o);
//判斷副檔名,使用對應函式將檔案存入
switch (strtolower($ext)) {
case 'jpg':
case 'jpeg':
//imagejpeg(圖像來源,儲存路徑,圖像品質)
imagejpeg($image_pic,$this->output,$this->quality);
case 'png':
//imagepng(圖像來源,儲存路徑,圖像品質)
imagepng($image_pic,$this->output,round(9*($this->quality/100)));
case 'gif':
imagegif($image_pic,$this->output); break;
default:
die('不支援此圖片格式'); break;
}
//釋放資源
imagedestroy($image_pic);
//回傳縮圖後的路徑
return $output;
}
/**
判斷路徑是否為空,且檔案是否真實存在
*/
public function isExist($path='')
{
if($path!='' && file_exists($path)){
return true;
}
return false;
}
/**
產生資料夾
*/
public function genDir($path='')
{
$imageInfo = pathinfo($path);
$dir=$imageInfo['dirname'].'/';
if(!is_dir($dir)){
mkdir($dir, 0777, TRUE);
//禁止直接訪問目錄
$str = "Directory access is forbidden.";
$x = fopen($dir."index.html","a+");
fwrite($x,$str);
fclose($x);
}
}
}使用方式
<?php include 'thumb.class.php'; $thumb = new Thumb(); $thumb->width = 200; //設定縮圖寬度 $thumb->height = 200; //設定縮圖高度 $thumb->quality = 90; //設定縮圖品質 //$thumb->output = ''; //設定輸出路徑 $thumb->save( 'path/7b7a577d1d9450c70c9993c49bcd63a4.png');
這次有好好的粗略測試過,是能運行的。
但原圖若有透明度有時似乎輸出的不完美。改天有空再研究看看。
文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)
原文連結:
https://blog.aidec.tw/post/php-thumb
若有業務合作需求,可寫信至: [email protected]
創業、網站經營相關內容未來將發布在 小易創業筆記