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

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

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

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

Джонатан

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