Самый быстрый способ чтения метаданных PNG в PHP - PullRequest
2 голосов
/ 04 ноября 2010

Я хотел бы извлечь два поля из файла PNG. А именно, поле геометрии и одно из полей из метаданных.

Какой самый быстрый способ сделать это? Я провел сравнительный анализ моего сценария, который в настоящее время выполняет это, и на данный момент самым медленным действием является выполнение самой программы ImageMagick «определить» в файле PNG. (0,4 секунды против 0,0001 секунды для анализа выведенного массива для геометрии и 8,39E-5 секунд для анализа ключевых фраз из метаданных)

Заранее спасибо за любую помощь,

Jonathan

1 Ответ

1 голос
/ 04 ноября 2010

Я не знаком ни с какими готовыми библиотеками или классами, чтобы делать это на PHP без вызова подпроцесса, но если вы не можете его найти, то, безусловно, стоит написать собственное.

PNG - довольно простой формат блочного потока, поэтому поиск определенного блока и извлечение некоторых полей заголовка тривиален.

Все, что вам нужно, это что-то, что читает и проверяет 8-байтовый 89 50 4E 47 0D 0A 1A 0A заголовок PNG, а затем чередует чтение 8 байтов (длина фрагмента плюс тип) и поиск по блоку, используя длину, пока вы не достигнете типа фрагмента ты хочешь.

Для геометрии, если PNG следует спецификации, вот как это будет:

  1. Считать и проверить заголовок PNG (8 байт)
  2. Чтение и проверка заголовка первого блока (8 байт).
    1. Успех. type = IHDR
    2. Считать дополнительные 8 байтов для геометрии (ширина, высота. 4 байта каждый)
  3. Если другое требуемое поле отсутствует в IHDR , используйте размер фрагмента, начиная с шага 2, чтобы перейти к следующему блоку в поисках другого требуемого поля.

Вероятно, мне понадобится от 5 до 15 минут, чтобы создать что-то подобное в Python. (Я делал подобные вещи с RAR и GIF) Может быть, 15-25 в PHP, так как у меня меньше опыта выполнения низкоуровневых файловых операций ввода-вывода.

...