Самый быстрый способ определить разрешение изображения и тип файла в командной строке PHP или Unix?


В настоящее время я использую ImageMagick для определения размера изображений, загружаемых на веб-сайт. Вызывая команду ImageMagick "идентифицировать" в командной строке, требуется около 0,42 секунды, чтобы определить размеры JPEG размером 1 МБ, а также тот факт, что это JPEG. Я нахожу это немного медленным.

Использование PHP-библиотеки Imagick еще медленнее, так как она пытается загрузить весь 1 МБ в память, прежде чем выполнять какую-либо обработку изображения (в данном случае, просто определяя его размер и тип).

Являются существуют ли какие-либо решения для ускорения этого процесса определения типа файла и размеров произвольного файла изображения? Я могу жить с этим, поддерживая только JPEG и PNG. Для меня важно, чтобы тип файла определялся по заголовкам файла, а не просто по расширению.

Редактировать: Решением может быть инструмент командной строки UNIX, вызываемый PHP, очень похожий на то, как я сейчас использую ImageMagick

Author: Peter, 2008-09-18

7 answers

Извините, я не могу добавить это в качестве комментария к предыдущему ответу, но у меня нет репутации. Выполнив несколько быстрых и грязных тестов, я также обнаружил, что exec ("идентифицировать -пинг... это примерно в 20 раз быстрее, чем без -пинга. Но getimagesize(), по-видимому, еще примерно в 200 раз быстрее.

Поэтому я бы сказал, что getimagesize() - более быстрый метод. Я тестировал только на jpg, а не на png.

Тест просто

$files = array('2819547919_db7466149b_o_d.jpg', 'GP1-green2.jpg', 'aegeri-lake-switzerland.JPG');
foreach($files as $file){
  $size2 = array();
  $size3 = array();
  $time1 = microtime();
  $size = getimagesize($file);
  $time1 = microtime() - $time1;
  print "$time1 \n";
  $time2 = microtime();
  exec("identify -ping $file", $size2);
  $time2 = microtime() - $time2;
  print $time2/$time1 . "\n";
  $time2 = microtime();
  exec("identify $file", $size3);
  $time2 = microtime() - $time2;
  print $time2/$time1 . "\n";
  print_r($size);
  print_r($size2);
  print_r($size3);
}
 3
Author: Steven Noble, 2008-09-18 19:40:28

Если вы используете PHP с поддержкой GD, вы можете попробовать getimagesize().

 7
Author: J D OConal, 2013-06-13 23:17:33

Вы пробовали

identify -ping filename.png

?

 4
Author: Vinko Vrsalovic, 2008-09-18 08:00:25

Для меня важно, чтобы тип файла определялся по заголовкам файла, а не просто по расширению.

Для этого вы можете использовать команду unix "файл" (или некоторую функцию php, которая реализует ту же функциональность).

/tmp$ file stackoverflow-logo-250.png
stackoverflow-logo-250.png: PNG image data, 250 x 70, 8-bit colormap, non-interlaced

 2
Author: Kasprzol, 2008-09-18 07:48:43

На самом деле, чтобы использовать getimagesize(), вам НЕ нужно, чтобы GD был скомпилирован.

Вы также можете использовать mime_content_type() для получения типа MIME.

 2
Author: William Macdonald, 2008-09-18 08:49:10

Exif_imagetype() работает быстрее, чем getimagesize().

$filename = "некоторый файл";
$данные = exif_imagetype($имя файла);
эхо "";
print_r($данные);
эхо"ПРЕ>";

Вывод:

Array (
        [FileName] => somefile
        [FileDateTime] => 1234895396
        [FileSize] => 15427
        [FileType] => 2
        [MimeType] => image/jpeg
        [SectionsFound] => 
        [COMPUTED] => Array
            (
                [html] => width="229" height="300"
                [Height] => 300
                [Width] => 229
                [IsColor] => 1
        )
)
 1
Author: jproffer, 2009-02-17 18:57:24

Если вы используете PHP, я бы предложил использовать библиотеку Imagick вместо вызова exec(). Функция, которую вы ищете, это Imagick::pingimage().

 0
Author: kralyk, 2013-03-27 11:26:45