ホームページ > バックエンド開発 > PHPチュートリアル > [Sanfen] 写真を撮った後、ディレクトリの画像をバッチで再帰的に拡大縮小するための小さなコードです。

[Sanfen] 写真を撮った後、ディレクトリの画像をバッチで再帰的に拡大縮小するための小さなコードです。

WBOY
リリース: 2016-06-23 14:11:09
オリジナル
855 人が閲覧しました

新しい一眼レフを買って一週間、今日やっと妻と母をライチ公園に連れて行って写真を撮る機会ができました。帰ってきたらフォトアルバムにアップロードするつもりでした。突然、すべての画像が少し大きすぎることに気づき、ツールを見つけるのにうんざりし、オンラインで直接コードをかき集めました。指定されたディレクトリ内の画像は、指定されたサイズ範囲に従って拡大縮小され、将来の写真処理のために指定されたディレクトリに出力されることに注意してください。

    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();
ログイン後にコピー



ライブラリ コードを添付する必要はありません。

ディスカッションへの返信 (解決策)

実行したところ、画像が多すぎて実行時間が足りないことがわかりました。ini_set('max_execute_time',3600); を追加するだけです。

上記は間違って書かれています。max_execution_time に修正してください

コードは没収されました ~~ とても良いです。

30階にリプライすると、今日のありのままの美しさの写真が届きます!

... ...

ちょっと?ちょっと?ちょっと?

30階に返信すると、今日のありのままの美しさの写真が届きます!

はは、クラスが折りたたまれました、....

using using using using - いいんじゃないですか?

サイズ変更方法は非常に肥大化しているようです


来て見てください

これはいいです、保存してください、必要になります

最近3K以上の写真を撮り、約20Gの写真を撮りました。プログラムは書かれていたので、問題なく動作するでしょう。切り替え後、私が眠りに落ちて間もなく、私のコンピューターが母親に攻撃され、直接シャットダウンされました。開いてみると、転送された写真は 400 枚だけだったので、再度実行すると、この 400 枚の写真に対して操作が繰り返されることになるため、コードをいじって重複を削除し、ログ機能を追加しました。

<?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 ""; }}
ログイン後にコピー


//在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); //求出绽放比例//...........
ログイン後にコピー


とても良いですね〜マークはそれを学びましょう〜

テクノロジーの流れは人生を変えます... 投稿者が美しい女性の写真を投稿するのを待ちます

コードが保存されると、コードが回転します投稿者が深センで働いていることを知りました

深センに来て2年になります、時間があれば一緒に出てきておしゃべりします。

コードは保存されました。元の投稿者は深センで動作することがわかりました

1. echo HTML タグを確認してください。これが最初の質問です。このプログラムは Web メソッドではなく、コマンド ラインを使用して実行するのが適切です。

2. if($width < $maxWidth || $height < $maxHeight) return ; あなたの計画は何ですか?


3. 再帰的なディレクトリには RecursiveDirectoryIterator を使用する方がはるかに優れています。マニュアル (ユーザー ディスカッション ボード) には、このクラスを作成する能力があれば、ルーチンを習得するのは難しくありません

4. サイズを変更します。アルゴリズム もっと簡単にできるので、もう一度考えてみましょう

5. 写真がたくさんある場合は、GD の代わりに ImageMagick を使用することをお勧めします。これはより効率的です

6."n" "/"PHP_EOL に置き換えて、 win との互換性のための DIRECTORY_SEPARATOR 定数


最後に、多数の画像のサイズを変更するには、ツールを使用することをお勧めします。ただし、プロ仕様のソフトウェアは効率が高く、出力画像の品質を制御できます。アップロードされた画像の後続の処理に使用されますが、これはまだ非常に便利です
サイズ変更方法は、インターネットから直接、書き込み方法には注意を払わなかったので、ここではそれを真剣に受け止めるつもりはありません。迅速な統合と実装!
1. echo HTML タグを見てください。これが最初の質問です。このプログラムは Web メソッドではなく、コマンド ラインを使用して実行する必要があります。
2. if($width < $maxWidth || $height < $maxHeight ) return ; 論理的なエラーがあると思いますが、どのような計画ですか?

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已碎 呵呵,笑死我了。。。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート