← На главную

Nibnib: формат изображений с очень быстрым декодированием

30.10.2026 04:17 · hackernews

Raph Levien разработал экспериментальный формат изображений Nibnib, рассчитанный прежде всего на предельно быстрое декодирование. Исходной задачей был вывод картинки через DVI на микроконтроллере RP2350. В таком устройстве на обработку пикселя остаётся примерно шесть тактов: их хватает на чтение данных, обращение к палитре и запись в буфер строки, но почти не остаётся резерва на сложные вычисления.

В основе Nibnib лежит палитра, однако в ней хранятся не абсолютные цвета, а поправки к предыдущему пикселю. За один байт входных данных декодер получает сразу два пикселя, поэтому итоговая плотность составляет 4 бита на пиксель. Предыдущее значение дублируется на пару, к нему прибавляется 32-битный элемент палитры, а результат даёт два цвета RGB 565. Такой подход особенно улучшает плавные области по сравнению с обычными палитровыми изображениями. Сам декодер детерминирован и очень прост.

Кодирование, напротив, требует поиска и сейчас на порядки медленнее декодирования. Алгоритм перебирает 256 элементов палитры, выбирает вариант с наименьшей ошибкой для обоих пикселей и распределяет остаточную ошибку по методу Флойда — Стейнберга. При выборе учитывается, что зрение человека чувствительнее к низким пространственным частотам, поэтому сумма цветов пары важнее их разницы.

Первоначальная палитра объединяет куб небольших приращений и случайные значения, полученные с помощью взвешенных гауссовых распределений. Куб нужен, чтобы без переполнения достигать значений около нуля и максимума; без него возникают заметные артефакты. Пока палитра не подстраивается под конкретное изображение.

Автор видит несколько путей улучшения качества: адаптивную палитру, более глубокий поиск с учётом следующих пикселей и кодирование справа налево или с чередованием направления по строкам. Сейчас жадный поиск оставляет артефакты справа от резких границ. Ускорить можно и перебор палитры. Все эти изменения не потребуют усложнения декодера.

Формат содержит лишь размеры, палитру и строки пикселей, без дополнительных метаданных. Levien не позиционирует его для архивного хранения: основное применение — тесная интеграция с простым декодером.

Читать оригинал →