首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

[散分]生涯便利小代码,拍照后,批量递归缩放目录图片

2013-07-01 
[散分]生活便利小代码,拍照后,批量递归缩放目录图片.新入手单反一周了,今天终于找上了机会带上老婆老妈去

[散分]生活便利小代码,拍照后,批量递归缩放目录图片.
新入手单反一周了,今天终于找上了机会带上老婆老妈去荔枝公园拍了一天的照,回来准备上传至相册,突然发现,每张图片都有点偏大,找工具也很累,直接上网,东拼西凑了点代码.实现将指定目录的图片,按指定大小范围缩放并输出到指定目录(含递归) ,供自己以后处理相片使用. 不多废话了,附代码.


    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();

lib 库代码.

<?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>";
    }
}




------解决方案--------------------


晕一个 上面的写错了,更正为 max_execution_time 
[解决办法]
代码没收了~~很好。
[解决办法]
回帖超过30楼,送今日偷拍美女照片一张!
[解决办法]
哈哈,类收起,....
[解决办法]
           $maxWidth = $this->_option["maxWidth"];
           $maxHeight = $this->_option["maxHeight"];
放到循环外不是更好些?

resize 方法显得很臃肿

[解决办法]
进来看看
[解决办法]
这个不错,收藏一下,要用到
[解决办法]

最近照了3k多张图片约20G图片,本以为程序写好后,就happy 的在运行转换了,谁知,当我当睡没多久,电脑遭遇老妈黑手,直接断电式关机.打开一看,只转了400张,再次运行,这400张图片将重复操作,于是折腾了一下代码,将重复去掉,并追加日志记录功能.


//在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); //求出绽放比例
//...........



[解决办法]
好建议,写得太随手,已修改!
引用:
           $maxWidth = $this->_option["maxWidth"];
           $maxHeight = $this->_option["maxHeight"];
放到循环外不是更好些?

resize 方法显得很臃肿




    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;


    }


[解决办法]
很不错~Mark学习一下~[散分]生涯便利小代码,拍照后,批量递归缩放目录图片
[解决办法]
技术流改变生活....等楼主放美女照片
[解决办法]
代码收藏了,原来楼主是在深圳工作
[解决办法]
来深圳两年了,有空一起出来,聊天吹水.

[解决办法]
自己用更加要快,代码漂亮反而是次要的

不纠结上不了#30啊,看来我应该把6点分开6层楼……
[解决办法]
呵呵,大家期待放照呢  
[解决办法]
我是来看美女的
[解决办法]
楼主快爆照

热点排行