搜尋
首頁後端開發php教程[散分]生活便利小代码,拍照后,批量递归缩放目录图片.

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

    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 class="brush:php;toolbar:false">");        if ($type == 'json') {  $array = json_decode($array);    }        print_r($array);        print("
");        echo "

";        echo  "";    }}


回复讨论(解决方案)

刚运行了一下,发现图片太多,运行时间不够,加一句 ini_set('max_execute_time',3600); 即可.

晕一个 上面的写错了,更正为 max_execution_time 

代码没收了~~很好。

回帖超过30楼,送今日偷拍美女照片一张!

... ... 
有点吗?有点嘛?有点啊?!
回帖超过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学习一下~

技术流改变生活....等楼主放美女照片

代码收藏了,原来楼主是在深圳工作

来深圳两年了,有空一起出来,聊天吹水.
代码收藏了,原来楼主是在深圳工作

1.看你echo html 标签,这是第一个问题,这个程序理应适合用命令行执行,而不是web方式

2. if($width 
3.递归目录用RecursiveDirectoryIterator 会爽很多,手册(用户讨论版)上面就有很多例程,以你能写出这个类的本领,看看应该例程不难掌握

4.resize的算法可以更加简单,再想想吧

5.图片很多的话建议用ImageMagick而不是GD,效率更高

6."\n" "/"换成PHP_EOL和DIRECTORY_SEPARATOR常量吧,兼容一下win


最后的最后,大量图片还是用工具做缩放吧,专业软件效率高而且能控制输出的图片质量
但你的这个类修改后可以用在处理上传图片的后续处理,还是用处不小

resize 这个方法,直接来自互联网, 我并未关注里面的写法,这里也不愿意去较真,更多的是快速整合与实现!
1.看你echo html 标签,这是第一个问题,这个程序理应适合用命令行执行,而不是web方式

2. if($width 
3.递归目录用RecursiveDirectoryIterator 会爽很多,手册(用户讨论版)上面就有很多例程,以你能写出这个类的……

不要纠结效率啥的,前提是生活便利

imagick 核心三行代码完成缩略图,问题是你可能正好没imagick环境呢,或者安装了版本不匹配呢,这一折腾,我转换都快完成啦
$image = new Imagick("mypicture.png");
$image->thumbnailImage(200, 150, true);
$image->writeImage("thumb.png");

前面是凑字的,可完全忽略

我主要的意思是,LZ,你能否先放出图呢?

自己用更加要快,代码漂亮反而是次要的

不纠结上不了#30啊,看来我应该把6点分开6层楼……

呵呵,大家期待放照呢  

我是来看美女的

楼主快爆照

过来参合一下~

F5已碎

有分散都没人接?快点盖到30楼

速速上图

接分外加看美女照片 兄弟们雄起啊 就差两楼了

楼下的 兄弟们终于等到你了....

照片涅

代码真心不错,最重要的是服务生活的思想,太酷了!
貌似我是30楼啊!!
中奖了!

sorry,图片在家里的机器上,回家立马补上~

不是美女揍一顿

我只对相片感兴趣

人格担保,图片来自偷拍~




请问我是看中间这个美女的上面还是下面?

echo    '先别急嘛,伯虎兄,你要知道美女这种东西,跟鲜花一样,需要有绿叶来衬托才会显出她的娇媚,你再看看嘛';

美女看了,代码收下了!!哈哈

确实是美女,不过美女是不是穿个山寨衣服呀。 “never cry” 少个“y”?

出去走走,放松心情。周末程序员们都去拍照吧~

好东西,收藏了,谢谢!

先  mark,  日后再说

确实是美女,不过美女是不是穿个山寨衣服呀。 “never cry” 少个“y”?

哈哈 这个 可以有

46楼真相

F5已碎 呵呵,笑死我了。。。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),