Самый быстрый способ чтения метаданных PNG в PHP


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

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

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

Джонатан

Author: Jonathan Chan, 2010-11-04

1 answers

Я не знаком ни с какими готовыми библиотеками или классами, чтобы сделать это на 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, так как у меня меньше опыта в выполнении низкоуровневого ввода-вывода файлов в нем.

 1
Author: ssokolow, 2010-11-04 04:24:14