[散分]生活便利小代码,拍照后,批量递归缩放目录图片.
新入手单反一周了,今天终于找上了机会带上老婆老妈去荔枝公园拍了一天的照,回来准备上传至相册,突然发现,每张图片都有点偏大,找工具也很累,直接上网,东拼西凑了点代码.实现将指定目录的图片,按指定大小范围缩放并输出到指定目录(含递归) ,供自己以后处理相片使用. 不多废话了,附代码.
header('Content-type:text/html; charset=utf-8');
require "lib/imgHelper.php";
$imgHelper = new imgHelper( "dir1" );
$imgHelper->setOutputDir( "dir2" );
//默认输出在1024 768 下等比缩放,需要自定义时,$imgHelper->setOutputSize(1440,900);
$imgHelper->execution();
<?php
/**
* 图片处理助手
*/
class imgHelper
{
public $srcFiles; //源文件 array
public $srcDirs; //源目录
public $exportDir; //输出目录
public $exportFiles; //输出文件 array
private $_option = array("maxWidth"=>"1024" , "maxHeight"=>"768");
function __construct($dir = '' , $option = array() )
{
if (!$dir) return;
$this->srcDirs = $dir;
$this->srcFiles = $this->traversal($dir);
$this->setOptions( $option );
}
/**
* 设置输出目录
* @param $dir
*/
public function setOutputDir( $dir )
{
if( !is_dir( $dir )) { mkdir($dir , 0777 , 1);}
$this->exportDir = $dir;
}
public function execution()
{
foreach( $this->srcFiles as $key =>$val ):
$srcImg = $val;
$toFile = str_replace( $this->srcDirs , $this->exportDir , $srcImg); //todo 简便处理.
$maxWidth = $this->_option["maxWidth"];
$maxHeight = $this->_option["maxHeight"];
$this->resize($srcImg , $toFile , $maxWidth , $maxHeight );
endforeach;
}
//缩放图片.
private function resize($srcImage,$toFile,$maxWidth = 100,$maxHeight = 100,$imgQuality=100)
{
//创建目录目录!
$pInfo = pathinfo( $toFile );
$dir = $pInfo["dirname"]; if(!is_dir( $dir) ){ mkdir($dir , 0777 , 1);}
list($width, $height, $type, $attr) = getimagesize($srcImage);
if($width < $maxWidth || $height < $maxHeight) return ;
switch ($type) {
case 1: $img = imagecreatefromgif($srcImage); break;
case 2: $img = imagecreatefromjpeg($srcImage); break;
case 3: $img = imagecreatefrompng($srcImage); break;
}
$scale = min($maxWidth/$width, $maxHeight/$height); //求出绽放比例
if($scale < 1) {
$newWidth = floor($scale*$width);
$newHeight = floor($scale*$height);
$newImg = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newImg, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
$newName = "";
$toFile = preg_replace("/(.gif|.jpg|.jpeg|.png)/i","",$toFile);
switch($type) {
case 1: if(imagegif($newImg, "$toFile$newName.gif", $imgQuality))
return "$newName.gif"; break;
case 2: if(imagejpeg($newImg, "$toFile$newName.jpg", $imgQuality))
return "$newName.jpg"; break;
case 3: if(imagepng($newImg, "$toFile$newName.png", $imgQuality))
return "$newName.png"; break;
default: if(imagejpeg($newImg, "$toFile$newName.jpg", $imgQuality))
return "$newName.jpg"; break;
}
imagedestroy($newImg);
}
imagedestroy($img);
return false;
}
/**
* 设置输出的大小
* @param string $width
* @param string $height
*/
public function setOutputSize( $width = "1024" , $height = "768"){
$_option = array("maxWidth"=>"$width" , "maxHeight"=>"$height");
$this->setOptions( $_option );
}
/**
* 设置可选参数
* @param $option
*/
private function setOptions( $option)
{
foreach( $option as $key =>$val):
if( isset( $option[$key]) && $option[$key] ){
$this->_option[$key] = $val;
}
endforeach;
}
/**
* 遍得到文件夹下的所有文件
*/
private function traversal($path)
{
if (!$path) return array();
$files = array();
if (!is_dir($path)) return;
foreach (scandir($path) as $file)
{
if ($file != '.' && $file != '..') {
$path2 = $path . '/' . $file;
if (is_dir($path2)) {
$temp = $this->traversal($path2);
$files = array_merge($files, $temp);
} else {
if ($this->isIMg($file)) {
$files[] = $path . "/" . $file;
}
}
}
}
return $files;
}
/**
* 判断是否是图片
* @param $file
* @return bool
*/
private function isIMg($file) {
$pInfo = pathinfo( $file);
$extention = $pInfo["extension"];
return preg_match("/(jpg)|(png)|gif/i" , $extention);
}
/** * 调试数据 */
public function debug() {$this->pr($this->srcFiles, "待处理图片数组.");
$this->pr( $this->srcDirs , "源目录");
$this->pr( $this->exportDir , "目标目录");
}
private function pr($array, $title = 'DEBUG', $type = 'array', $width = '') { /*** @格式化输出 */
$title .= date("Y-m-d H:i:s");
$widthStr = "";
if ($width) $widthStr = "width:$width" . "px";
echo "<fieldset style="-moz-border-radius:5px 5px 5px 5px; -moz-box-shadow:0px 0px 10px rgba(00,00,00,0.45); border: 3px solid transparent; padding:3px; margin-top:20px; "><legend style="color: #069; margin:3px; $widthStr ">$title</legend>";
echo "<div style = '-moz-border-radius:10px 10px 10px 10px;font-size:14px; color:#069; border:1px solid #F0FAF9; font-size:9pt; background:#F0FAF9; padding:5px;'>";
print("<pre>");
if ($type == 'json') { $array = json_decode($array); }
print_r($array);
print("</pre>");
echo "<div>";
echo "</fieldset>";
}
}
//在class imgHelper 内.添加如下代码.
private $copyOverWrite = true;
private $isLog = true;
/**
* 设置是否日志记录
* @param $bool
*/
public function setIsLog( $bool )
{
$this->isLog = $bool;
}
/**
* 设置是否覆盖
* @param $bool
*/
public function setCopyOverWrite( $bool ){
$this->copyOverWrite = $bool;
}
//记录日志.
private function log( $str ,$title = '图片助手日志' )
{
$logFile ="log/".date("Y-m-d").".log";
$pInfo = pathinfo( $logFile );
$dir = $pInfo["dirname"]; if(!is_dir( $dir) ){ mkdir($dir , 0777 , 1);}
$str = date("H:i:s").$str . "\n";
file_put_contents($logFile, $str,FILE_APPEND);
}
//对function resize() 进行修改
//追加至首行.
if( !$this->copyOverWrite && is_file($toFile)) //当设置为不覆盖,以及文件已存在时,跳过
{
$this->log("$toFile 已存在,且系统设置为不覆盖,将做跳过处理","操作提示");
return ;
}
$this->log( "正在努力的生成 $toFile " );
//修改后
private function resize($srcImage,$toFile,$maxWidth = 100,$maxHeight = 100,$imgQuality=100)
{
if( !$this->copyOverWrite && is_file($toFile)) //当设置为不覆盖,以及文件已存在时,跳过
{
$this->log("$toFile 已存在,且系统设置为不覆盖,将做跳过处理","操作提示");
return ;
}
$this->log( "正在努力的生成 $toFile " );
//创建目录目录!
$pInfo = pathinfo( $toFile );
$dir = $pInfo["dirname"]; if(!is_dir( $dir) ){ mkdir($dir , 0777 , 1);}
list($width, $height, $type, $attr) = getimagesize($srcImage);
if($width < $maxWidth
[解决办法]
$height < $maxHeight) return ;
switch ($type) {
case 1: $img = imagecreatefromgif($srcImage); break;
case 2: $img = imagecreatefromjpeg($srcImage); break;
case 3: $img = imagecreatefrompng($srcImage); break;
}
$scale = min($maxWidth/$width, $maxHeight/$height); //求出绽放比例
//...........
public function execution()
{
$maxWidth = $this->_option["maxWidth"];
$maxHeight = $this->_option["maxHeight"];
foreach( $this->srcFiles as $key =>$val ):
$srcImg = $val;
$toFile = str_replace( $this->srcDirs , $this->exportDir , $srcImg); //todo 简便处理.
$this->resize($srcImg , $toFile , $maxWidth , $maxHeight );
endforeach;
}