2012-03-21 3 views
1

У меня есть огромное количество фотографий, которые нужно сортировать. Мне нужно знать размеры каждой фотографии, чтобы знать или она нуждается в повторной калибровке. Будучи программистом, я убежден, что это должен быть более быстрый способ.PHP Получить размеры изображений в каталоге

У меня довольно далеко. Следующий код считывает каталог и все вспомогательные устройства. Но в тот момент, когда я пытаюсь извлечь размеры, цикл останавливается на 8% всех снимков, требующих проверки. Может быть, PHP не может делать больше вычислений? Что происходит!?

Это как далеко я получил:

checkDir('dir2Check');

function checkDir($dir, $level = 0) { 
if ($handle = opendir($dir)) { 
    while (false !== ($entry = readdir($handle))) { 
     if (!preg_match('/\./i', $entry)) { 
      echo echoEntry("DIR\\", $entry, $level); 
      checkDir($dir.'/'.$entry, $level+1); 
     } else { 
      if ($entry != "." && $entry != ".." && $entry != ".DS_Store") { 
       // if I comment the next line. It loops through all the files in the directory 
       checkFile($entry, $dir.'/'.$entry, $level); 

       // this line echoes so I can check or it really read all the files in case I comment the proceeding line 
       //echo echoEntry("FILE", $entry, $level); 
      } 
     } 
    } 
    $level--; 
    closedir($handle); 
} 

}

// Checks the file type and lets me know what is happening 
function checkFile($fileName, $fullPath, $level) { 
if (preg_match('/\.gif$/i', $fullPath)) { 
    $info = getImgInfo(imagecreatefromgif($fullPath)); 
} else if (preg_match('/\.png$/i', $fullPath)) { 
    $info = getImgInfo(imagecreatefrompng($fullPath)); 
} else if (preg_match('/\.jpe?g$/i', $fullPath)){ 
    $info = getImgInfo(imagecreatefromjpeg($fullPath)); 
} else { 
    echo "XXX____file is not an image [$fileName]<br />"; 
} 

if ($info) { 
    echo echoEntry("FILE", $fileName, $level, $info); 
} 

}

// get's the info I need from the image and frees up the cache 
function getImgInfo($srcImg) { 
$width = imagesx($srcImg); 
$height = imagesy($srcImg); 
$info = "Dimensions:".$width."X".$height; 

imagedestroy($srcImg); 
return $info; 

}

// this file formats the findings of my dir-reader in a readable way 
function echoEntry($type, $entry, $level, $info = false) { 
$output = $type; 

$i = -1; 
while ($i < $level) { 
    $output .= "____"; 
    $i++; 
} 

$output .= $entry; 

if ($info) { 
    $output .= "IMG_INFO[".$info."]"; 
} 

return $output."<br />"; 

}

+0

Можете ли вы дать нам и ошибки? –

+0

Как выглядит ваш 'max_execution_time' в' php.ini'? –

ответ

3

Следующие делают подобное тому, что вы делаете, только он использует DirectoryIterator PHP, который в моем скромном мнение более чистое и больше ООП-у

<?php 

function walkDir($path = null) { 
    if(empty($path)) { 
     $d = new DirectoryIterator(dirname(__FILE__)); 
    } else { 
     $d = new DirectoryIterator($path); 
    } 

    foreach($d as $f) { 
     if(
      $f->isFile() && 
      preg_match("/(\.gif|\.png|\.jpe?g)$/", $f->getFilename()) 
     ) { 
      list($w, $h) = getimagesize($f->getPathname()); 
      echo $f->getFilename() . " Dimensions: " . $w . ' ' . $h . "\n"; 
     } elseif($f->isDir() && $f->getFilename() != '.' && $f->getFilename() != '..') { 
      walkDir($f->getPathname()); 
     } 
    } 
} 

walkDir(); 
+0

: D Я люблю решение. Хорошая работа! Но я все еще удивляюсь, почему мой сценарий остановился после нескольких строк. Вы знаете? – SKuijers

+0

Теперь скрипт работает. Спасибо за ваш вклад. Дело, останавливающее мой сценарий, состояло в том, что снимки, где слишком большие и imagecreatefromjpeg ($ fullPath) терпят неудачу, если недостаточно памяти. Это было решено путем увеличения этого: ini_set ('memory_limit', '500M'); – SKuijers

1

Вы можете просто использовать getimagesize()

list($width, $height) = getimagesize($imgFile); 
+0

Спасибо человек. Это более легкие решения. Но мой первоначальный вопрос был; 'что происходит?'. Не могли бы вы узнать, почему мой сценарий останавливается? – SKuijers

+1

Вы сказали, что у вас огромное количество изображений в каталоге, поэтому после времени php может остановиться из-за 'max_execution_time' – safarov

+0

Я установил max_execution_time в 20 минут, но это не то, что останавливало мой скрипт. Это было связано с тем, что фотографии, где слишком большие и imagecreatefromjpeg ($ fullPath) терпят неудачу, если недостаточно памяти. Это было решено путем увеличения этого: ini_set ('memory_limit', '500M'); – SKuijers

 Смежные вопросы

  • Нет связанных вопросов^_^