Самый быстрый способ чтения метаданных PNG в PHP
Я хотел бы извлечь два поля из файла PNG. А именно, поле геометрии и одно из полей из метаданных.
Каков самый быстрый способ, которым я мог бы это сделать? Я провел сравнительный анализ своего скрипта, который в настоящее время выполняет это, и, безусловно, самым медленным действием является выполнение фактической программы ImageMagick "идентификация" в файле PNG. (.4 секунды против .0001 секунды для анализа выведенного массива для геометрии и 8,39 E-5 секунд для анализа ключевых фраз из файла PNG. метаданные)
Заранее благодарю за любую помощь,
Джонатан
1 answers
Я не знаком ни с какими готовыми библиотеками или классами, чтобы сделать это на PHP без вызова подпроцесса, но если вы не можете его найти, то, безусловно, лучше написать свой собственный.
PNG - довольно простой формат потока блоков, поэтому поиск определенного блока и извлечение некоторых полей заголовка является тривиальным.
Все, что вам нужно, - это что-то, что считывает и проверяет 8-байтовый заголовок 89 50 4E 47 0D 0A 1A 0A
PNG, а затем чередует чтение 8 байтов (длина фрагмента плюс тип) и поиск проходите мимо блока, используя длину, пока не попадете в нужный тип блока.
Для геометрии, предполагая, что PNG соответствует спецификации, вот как это будет выглядеть:
- Прочитайте и проверьте заголовок PNG (8 байт)
- Прочитать и проверить заголовок первого блока (8 байт)
- Успех.
type = IHDR
- Прочитайте дополнительные 8 байт для геометрии (ширина, высота. по 4 байта каждый)
- Успех.
- Если другого нужного вам поля нет в IHDR, используйте размер блока с шага 2 до перейдите к следующему блоку в поисках другого поля, которое вы хотели.
Вероятно, мне потребуется от 5 до 15 минут, чтобы создать что-то подобное на Python. (Я делал подобные вещи с RAR и GIF), Может быть, от 15 до 25 в PHP, так как у меня меньше опыта в выполнении низкоуровневого ввода-вывода файлов в нем.