Самый быстрый способ определить разрешение изображения и тип файла в командной строке PHP или Unix?
-
01-07-2019 - |
Вопрос
В настоящее время я использую ImageMagick для определения размера изображений, загружаемых на сайт.При вызове «identify» ImageMagick в командной строке требуется около 0,42 секунды, чтобы определить размеры JPEG размером 1 МБ, а также тот факт, что это JPEG.Я нахожу это немного медленным.
Использование PHP-библиотеки Imagick еще медленнее, поскольку она пытается загрузить весь 1 МБ в память, прежде чем выполнять какую-либо обработку изображения (в данном случае просто определять его размер и тип).
Существуют ли какие-либо решения, позволяющие ускорить процесс определения типа файла и размеров произвольного файла изображения?Я могу жить с этим только с поддержкой JPEG и PNG.Для меня важно, чтобы тип файла определялся по его заголовкам, а не просто по расширению.
Редактировать:Решением может быть инструмент командной строки UNIX, вызываемый PHP, очень похоже на то, как я сейчас использую ImageMagick.
Решение
Извините, я не могу добавить это в качестве комментария к предыдущему ответу, но у меня нет представителя.Проведя быстрое и грязное тестирование, я также обнаружил, что exec("identify -ping...примерно в 20 раз быстрее, чем без -ping.Но 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 = "какой-то файл";
$data = exif_imagetype($filename);
эхо "<PRE>";
print_r ($ данные);
эхо "</PRE>";
выход:
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().