Как реализовать PNG декодер полностью с нуля - PullRequest
0 голосов
/ 15 октября 2018

Я начал работать над библиотекой кодирования / декодирования PNG для целей обучения, поэтому я хочу реализовать каждую ее часть вручную.

Я довольно долго с этим справлялся, но теперь я немного застрял.Вот то, что я успешно реализовал:

  • Я могу загрузить двоичный файл PNG и просмотреть его байты
  • Я могу прочитать сигнатуру и блок IHDR для метаданных
  • Я могу прочитать блоки IDAT и объединить данные изображения в буфер
  • Я могу читать и интерпретировать заголовки zlib из вышеупомянутых данных изображения

И вот где язастрял.Я смутно знаю следующие шаги:

  • Извлечение сжатых данных zlib в соответствии с их заголовками
  • Выяснение используемых методов фильтрации и "отмена" их для получения необработанных данных
  • Если все прошло правильно, теперь у меня есть необработанные данные RGB в виде [<R of 1st pixel>, <G of 1st pixel>, <B of 1st pixel>, <R of 2nd pixel>, <G of 2nd pixel>, etc...]

Мои вопросы:

  • Есть ли что-нибудь легкое?реализация для понимания (может быть, с примерами) или руководство по извлечению zlib, так как мне было трудно понять официальные спецификации
  • Может ли быть несколько методов фильтрации, используемых в одном файле?Как это понять?Как определить «границы» этих по-разному отфильтрованных частей?
  • Является ли мое понимание того, как будут выглядеть правильные окончательные данные?А как насчет альфа-канала или когда используется палитра?

1 Ответ

0 голосов
/ 15 октября 2018
  1. Да.Вы можете взглянуть на puff.c , который является реализацией inflate, написанной с явной целью руководства к тому, как декодировать поток deflate.

  2. Каждая строкаизображения может использовать другой фильтр, который указан в первом байте декомпрессированной строки.

  3. Да, если все получится, то у вас будет последовательность пикселейгде каждый пиксель представляет собой значение в градациях серого, G, с альфа-каналом, GA, RGB (красный-зеленый-синий, в этом порядке) или RGBA.

...