PHP · 2013年7月1日 0

一个根据exif信息整理照片的小脚本

去了趟敦煌,又拍了些照片,回来整理照片的时候,发现电脑里有原本就有20来个G的照片,而且已经不知道哪些照片都是什么了。。文件夹居多,找起来好麻烦。。所以就写了个脚本来整理这些照片,整理以后感觉好多了。。

此脚本根据照片的exif信息来划定文件夹,整理后如图:
QQ截图20130701222840
看着清爽多了。。

脚本也不难,如果文件名相同且拍摄时间也相同则跳过,这样也避免了重复文件占用硬盘空间。

 <?php
/**
 * 整理照片文件
 * 目标目录结构为 path/设备名/年/月/
 *
 * @author 废墟<[email protected]>
 * @link https://anerg.com
 */
ini_set("memory_limit", -1);
ini_set("display_error", 1);
ini_set('exif.encode_unicode', 'UTF-8');
error_reporting(E_ALL);
date_default_timezone_set('Asia/Shanghai');

define('BASEPATH', dirname(__FILE__));
define('D_S', DIRECTORY_SEPARATOR);

class movePhoto {

    private $hash_array = array();
    private $path_src;
    private $path_new;

    public function __construct() {
        clearstatcache();
        $this->path_src = 'D:' . D_S . 'tmp' . D_S . 'p' . D_S;//原照片路径
        $this->path_new = 'D:' . D_S . 'newphoto' . D_S;//目标目录路径
    }

    public function run() {
        $this->moveFile($this->path_src);
    }

    public function moveFile($input) {
        $input = rtrim($input, D_S);
        if (is_dir($input)) {
            $input .= D_S;
            foreach (glob($input . "*") as $path) {
                if (is_dir($path)) {
                    $this->moveFile($path);
                }
                if (is_file($path)) {
                    if (preg_match("~jpg|jpeg$~i", $path)) {
                        $exif = exif_read_data($path, 0, true);
                        if (isset($exif['FILE']['FileName']) && isset($exif['FILE']['FileDateTime']) && isset($exif['IFD0']['Model'])) {
                            $new_path = $this->path_new . trim($exif['IFD0']['Model']) . D_S . date("Y", $exif['FILE']['FileDateTime']) . D_S . date("m", $exif['FILE']['FileDateTime']) . D_S;
                            if (!is_dir($new_path)) {
                                $this->mkpath($new_path);
                            }
                            if (!is_file($new_path . $exif['FILE']['FileName']))
                                rename($path, $new_path . $exif['FILE']['FileName']);
                        }
                    }
                }
            }
        }
    }

    private function mkpath($path) {
        return is_dir($path) or ($this->mkpath(dirname($path)) and (mkdir($path, 0777) and chmod($path, 0777)));
    }

}

$app = new movePhoto;
$app->run();
?>