Самый быстрый способ определить разрешение изображения и тип файла в командной строке PHP или Unix? - PullRequest
5 голосов
/ 18 сентября 2008

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

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

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

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

Ответы [ 7 ]

7 голосов
/ 18 сентября 2008

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

4 голосов
/ 18 сентября 2008

Вы пробовали

identify -ping filename.png

3 голосов
/ 18 сентября 2008

Извините, я не могу добавить это как комментарий к предыдущему ответу, но у меня нет представителя. Проведя некоторое быстрое и грязное тестирование, я также обнаружил, что exec («define -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);
}
2 голосов
/ 18 сентября 2008

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

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

2 голосов
/ 18 сентября 2008

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

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

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

1 голос
/ 17 февраля 2009

exif_imagetype () быстрее, чем getimagesize ().

$ filename = "somefile";
$ data = exif_imagetype ($ filename);
эхо "

";
print_r($data);
echo "
";

Выход:

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
        )
)
0 голосов
/ 27 марта 2013

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

...