Как часть моей домашней работы, я должен написать простой PNG-ридер в Python. Мне запрещено использовать любые библиотеки Python, которые работают с изображениями, и в результате у меня должен быть список списков (строк изображения) RGB-кортежей одиночных пикселей.Python PNG декодирование - кодирование Хаффмана
Декодер должен читать только самые основные изображения PNG, которые состоят только из блоков IHDR, IDAT и IEND, IDAT только с базовыми данными RGB. Моя программа до сих пор проверяет правильный заголовок PNG и распаковывает блок IDAT с помощью zlib.decompress().
На этом этапе я застрял в течение нескольких дней. Дескриптор zlib оставил данные изображения в состоянии, где у меня есть байтовое представление строк изображения следующим образом:
Каждая строка начинается с 1 байт, 0x00, 0x04, 0x02 или 0x01. Я обнаружил, что 0x00 означает, что строка находится в «исходных данных», что означает, что следующие байты представляют R, G или B пикселя и так далее до конца строки (нет фактического заголовка newline, но abother) байт"). 0x04 или 0x02, однако, как я читаю, закодированы в кодировке Хаффмана, и вот мой вопрос:
Как декодировать эти строки? Есть ли для этого функция python (как и для распаковки zlib для шага раздувания). Кроме того, последние 2 строки начинаются с 0x01, которые, как я читал о Deflate, должны означать «это последний блок в потоке». Почему у меня это в последних двух строках изображения, а не только в последнем? И данные последних двух строк также сбивают с толку, потому что некоторые пиксели явно находятся в «сыром» представлении, но некоторые нет.
Большое спасибо, я пытался найти свой ответ везде уже ...
Войта
Я просто обнаружил, что это не кодировка Хаффмана, которую я вижу, это фильтры PNG. Наконец, я нашел способ извлечь RGB-значения из этих строк: http://www.w3.org/TR/PNG/#9Filters –
Если это поможет, https://code.google.com/p/pngj /source/browse/pnjg/src/ar/com/hjg/pngj/PngReader.java – leonbloy