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

StackOverflow https://stackoverflow.com/questions/90758

Вопрос

В настоящее время я использую 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().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top