2008-09-18 3 views
5

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

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

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

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

ответ

3

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

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

+0

GD, вероятно, будет страдать от одной и той же проблемы со скоростью, так как она загрузит изображение в память ... – Gilles 2008-09-18 07:46:28

+0

True. Я не знаю иначе, чем писать его самостоятельно и одновременно сохраняя только часть изображения в памяти, но это будет зависеть от типа изображения. – 2008-09-18 07:47:31

2

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

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

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

+0

Я только что проверил это быстро в командной строке и, похоже, довольно медленно, взял вторую секунду, чтобы определить тип файла JPG. Кажется, он кэширует результат, но это малоинтересно, так как я проверю изображение только один раз. – Gilles 2008-09-18 07:51:08

+0

Частично это, вероятно, время, необходимое для синтаксического анализа волшебного файла. Вы можете одновременно запускать файл по целому ряду изображений. Или вы можете создать более мелкий магический файл только с общими типами файлов изображений. – palm3D 2008-09-18 08:25:16

4

Вы пробовали

identify -ping filename.png 

?

2

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

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

1

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

$ filename = "somefile";
$ data = exif_imagetype ($ filename);
echo "<PRE>";
print_r ($ data);
echo "</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 
     ) 
) 

0

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

Смежные вопросы