Кроме того, формат сжатия исключительно простой, закодирован буквально в 300 строчек кода, и работает по простым правилам типа кодирования повторов (RLE). Естественно, он не связан никакими лицензионными соглашениями и ограничениями.
И вот вчера после исправления всех недочётов наконец-то опубликованы финальные спецификации, так что теперь QOI документально забетонирован и его можно начинать использовать в продакшне. Что примечательно, полные спецификации QOI поместились на одной странице!
Собственно, вот эта страница, то есть спецификации формата целиком:

В спецификациях описан весь алгоритм кодирования. Доминик уже объяснял, что он обычный разработчик и не очень хорошо разбирается в сложных методах, которые используются в современных графических кодеках. Как программист он реализовал простые математические методы. Изображение кодируется в один проход, каждый пиксель считывается только один раз и кодируется одним из четырёх методов, по порядку:
- Если пиксель равен предыдущему, счётчик увеличивается на единицу. Если нет, то применяется метод 2, и так далее
- Пиксель равен элементу массива последних пикселей
- Записывается разница с предыдущим пикселем, если она небольшая
- Полное значение RGBA
Результирующие значения записываются в группы с указанием сначала тега (метод кодирования), после которого идут биты. Все группы выровнены по байтам для ускорения доступа в памяти.
За месяц автор получил более 500 комментариев, в том числе по оптимизации формата, так что теперь QOI стал ещё быстрее, а уровень сжатия вырос, см. бенчмарки на 2879 изображениях. Что самое удивительное, благодаря подсказкам коллег алгоритм сжатия стал ещё проще — автор удалил из формата заголовок
size
и некоторые лишние процедуры. Код референсного кодека и декодера опубликован на Github. Естественно, в него можно вносить любые изменения и дополнения, приспосабливая для своих нужд.За последние несколько недель написаны реализации QOI для многих популярных языков программирования и библиотек, включая Zig, Rust, Rust, Rust, Go, TypeScript, Haskell, Ć, Python, C#, Elixir, Swift, Java и Pascal, обёртки (врапперы) для Python и Lua. Разработано нативное приложение для просмотра файлов QOI, плагины для Gimp, Paint.NET и XNView MP, планируется поддержка в SDL_Image.
Бенчмарки, база 2879 изображений
Декодер, мс | Кодер, мс | Декодер, mpps | Кодер, mpps | Размер, КБ | Пропорция от оригинала | |
---|---|---|---|---|---|---|
libpng | 22,9 | 310,8 | 47,42 | 3,49 | 1799 | 56,6% |
stbi | 26,7 | 195,6 | 40,63 | 5,55 | 2498 | 78,6% |
qoi | 7,4 | 11,1 | 147,02 | 97,55 | 2102 | 66,2% |
QOI показывает разную эффективность на изображениях разных типов: скриншоты, текстуры, фотографии, иллюстрации из Википедии и т. д. На некоторых картинках он кодирует в 60 раз быстрее PNG, а на других только в 30.
Новый формат предназначен для задач с интенсивным кодированием/декодированием изображений, где важен не столько размер изображений, сколько нагрузка на CPU и скорость. Например, вычисления на облачном сервисе (с оплатой за CPU), обработка больших фотоколлекций, нагрузка headless-браузеров, скриншоты, веб-скрапинг и др. В наше время накопители очень дёшевы, так что скорость зачастую становится более важным фактором, чем экономия дискового пространства.