Понимание IDAT чанка, чтобы перевернуть изображение

Сначала немного контекста. Мне нужно перевернуть изображение PNG. Я получаю информацию за байт (по порядку), и я должен перевернуть ее как поток. Мне удается разделить и разобрать куски. Но когда у меня есть данные блока IDAT, я не знаю, что с ними делать, чтобы перевернуть их.

ИНФОРМАЦИЯ из IHDR: глубина в битах = 08 (8 бит на выборку) и тип цвета = 06. Изображение 800 x 600 = 480000

Размер IDAT равен 179502, то есть 0,374 от общего размера пикселя (странно).

Если я переворачиваю пиксели (все данные IDAT как есть), я получаю изображение, которое при открытии отображает прозрачное изображение. Я также попытался использовать 4 байта = 1 пиксель, так как у меня есть RGB + альфа, но все еще не получился хороший результат. (Всегда прозрачное изображение... это тоже очень странно... Я надеялся, что случайные изображения, а не прозрачные изображения).

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

Я также нахожу гекс 0x78 почти всегда после части IDAT, поэтому я сделал вывод, что массив пикселей сжатия запускается не сразу после IDAT, а через несколько байтов после... Если так... Как это организовано? это только массив пикселей или он содержит некоторую информацию до и / или после в данных блока IDAT?

1 ответ

Решение

Блок (и) IDAT включает данные пикселей изображения, предварительно отфильтрованные и сжатые. Чтобы получить RGB, вам нужно:

  • объединить все фрагменты IDAT
  • распаковать поток (ZLIB)
  • отфильтровать фильтр, примененный к каждой строке
  • в соответствии с пиксельным форматом изображения у вас могут быть компоненты RGB в каждом байте, или, возможно, в словах, или, возможно, в некоторых битах (и, возможно, они не являются компонентами RGB, но являются индексами в палитре, или шкале серого, или с помощью Alpha)...)

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

Другие вопросы по тегам