Самый быстрый способ определить разрешение изображения и тип файла в командной строке PHP или Unix?
В настоящее время я использую ImageMagick для определения размера изображений, загружаемых на веб-сайт. Вызывая команду ImageMagick "идентифицировать" в командной строке, требуется около 0,42 секунды, чтобы определить размеры JPEG размером 1 МБ, а также тот факт, что это JPEG. Я нахожу это немного медленным.
Использование PHP-библиотеки Imagick еще медленнее, так как она пытается загрузить весь 1 МБ в память, прежде чем выполнять какую-либо обработку изображения (в данном случае, просто определяя его размер и тип).
Являются существуют ли какие-либо решения для ускорения этого процесса определения типа файла и размеров произвольного файла изображения? Я могу жить с этим, поддерживая только JPEG и PNG. Для меня важно, чтобы тип файла определялся по заголовкам файла, а не просто по расширению.
Редактировать: Решением может быть инструмент командной строки UNIX, вызываемый PHP, очень похожий на то, как я сейчас использую ImageMagick
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);
}
Если вы используете PHP с поддержкой GD, вы можете попробовать getimagesize().
Вы пробовали
identify -ping filename.png
?
Для меня важно, чтобы тип файла определялся по заголовкам файла, а не просто по расширению.
Для этого вы можете использовать команду unix "файл" (или некоторую функцию php, которая реализует ту же функциональность).
/tmp$ file stackoverflow-logo-250.png
stackoverflow-logo-250.png: PNG image data, 250 x 70, 8-bit colormap, non-interlaced
На самом деле, чтобы использовать getimagesize(), вам НЕ нужно, чтобы GD был скомпилирован.
Вы также можете использовать mime_content_type() для получения типа MIME.
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 ) )
Если вы используете PHP, я бы предложил использовать библиотеку Imagick вместо вызова exec()
. Функция, которую вы ищете, это Imagick::pingimage().