QOI (формат изображения)
Расширение имени файла |
.который |
---|---|
Магическое число | qoif (4 байта, ASCII) |
Разработано | Доминик Шаблевски |
Первоначальный выпуск | 24 ноября 2021 г. |
Последний выпуск | 1.0 5 января 2022 г |
Тип формата | изображения без потерь растрового Формат |
Стандартный | Спецификация |
Открытый формат ? | Да |
Свободный формат ? | Да |
Веб-сайт | qoiformat.org |
Формат изображения Quite OK ( QOI ) — это спецификация для без потерь изображений сжатия 24-битных (8 бит на цвет RGB ) или 32-битных (8 бит на цвет с 8-битным альфа- каналом RGBA ) цветных растровых (растровых) изображений, изобретен Домиником Шаблевски и впервые анонсирован 24 ноября 2021 года. [1]
Описание [ править ]
Предполагаемой целью было создание с открытым исходным кодом метода сжатия без потерь , который был бы быстрее и проще в реализации, чем PNG . Цифры, указанные в сообщении блога, анонсирующем формат, утверждают, что кодирование происходит в двадцать-пятьдесят раз быстрее, а скорость декодирования в три-четыре раза выше, чем в PNG, при аналогичных размерах файлов. [1] Автор передал спецификацию в общественное достояние ( CC0 ). [2]
и языковая поддержка обеспечение Программное
QOI изначально поддерживается ImageMagick , [3] Imagine (v1.3.9+), IrfanView (v4.60+), [4] FFmpeg (v5.1+), [5] и Графический конвертер (v11.8+). [6] Microsoft PowerToys (v0.76+) для Windows 10 и 11 добавляет поддержку предварительного просмотра изображений QOI в проводнике Windows. [7] [8] созданные сообществом, Плагины, доступны в GIMP , Paint.NET и XnView MP . [9]
Игровой движок GameMaker определяет bzip2 + QOI в качестве формата групп текстур по умолчанию , начиная с версии 2022.1.0.609, для достижения лучшего сжатия, но при этом более быстрого распаковывания, в то время как автономные форматы QOI и PNG являются необязательными для еще большей производительности и лучшей совместимости соответственно. . [10] [11]
Существуют также реализации для различных языков, таких как Rust , Python , Java , C++ , C# и других. [12] Полный список можно найти в README репозитория Git(Hub) проекта .
Формат файла [ править ]
Заголовок [ править ]
Файл QOI состоит из 14-байтового заголовка, за которым следует любое количество «фрагментов» данных и 8-байтовый маркер конца.
qoi_header {
char magic[4]; // magic bytes "qoif"
uint32_t width; // image width in pixels (BE)
uint32_t height; // image height in pixels (BE)
uint8_t channels; // 3 = RGB, 4 = RGBA
uint8_t colorspace; // 0 = sRGB with linear alpha
// 1 = all channels linear
};
Поля цветового пространства и канала носят чисто информативный характер. Они не меняют способ кодирования фрагментов данных.
Кодировка [ править ]
Изображения кодируются построчно, слева направо, сверху вниз.
декодер и кодер начинаются с {r: 0, g: 0, b: 0, a: 255}
как предыдущее значение пикселя. Изображение считается полным, когда все пиксели, указанные в width * height
были покрыты. Пиксели кодируются как:
- Кодирование длины серии предыдущего пикселя (
QOI_OP_RUN
) - индекс в массиве ранее увиденных пикселей (
QOI_OP_INDEX
) - разница по сравнению с предыдущим значением пикселя в r,g,b (
QOI_OP_DIFF
илиQOI_OP_LUMA
) - Полные значения r,g,b или r,g,b,a (
QOI_OP_RGB
илиQOI_OP_RGBA
)
Предполагается, что цветовые каналы не умножаются предварительно на альфа-канал («альфа без предварительного умножения»). Бег array[64]
(инициализировано нулем) ранее увиденного пикселя
значения поддерживаются кодером и декодером. Каждый пиксель, видимый кодером и декодером, помещается в этот массив в позицию, образованную хэш-функцией значения цвета.
В кодировщике, если значение пикселя по индексу соответствует текущему пикселю, эта позиция индекса записывается в поток как QOI_OP_INDEX
. Хэш-функция для индекса:
index_position = (r * 3 + g * 5 + b * 7 + a * 11) % 64
Каждый фрагмент начинается с 2- или 8-битного тега, за которым следует несколько битов данных. Разрядность фрагментов делится на 8, т.е. все фрагменты выровнены по байтам. Все значения, закодированные в этих битах данных, имеют старший бит слева. 8-битные теги имеют приоритет над 2-битными тегами. Декодер должен сначала проверить наличие 8-битного тега. Конец потока байтов отмечен цифрой 7. 0x00
байты, за которыми следует один 0x01
байт.
Возможные фрагменты:
QOI_OP_RGB
[ редактировать ]
Байт[0] | Байт[1] | Байт[2] | Байт[3] | |||||||
---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | красный | зеленый | синий |
- 8-битный день
b11111110
(254) - 8-битное значение красного канала
- 8-битное значение зеленого канала
- 8-битное значение синего канала
Значение альфа остается неизменным по сравнению с предыдущим пикселем.
QOI_OP_RGBA
[ редактировать ]
Байт[0] | Байт[1] | Байт[2] | Байт[3] | Байт[4] | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | красный | зеленый | синий | альфа |
- 8-битный день
b11111111
(255) - 8-битное значение красного канала
- 8-битное значение зеленого канала
- 8-битное значение синего канала
- 8-битное значение альфа-канала
QOI_OP_INDEX
[ редактировать ]
Байт[0] (диапазон: 0 .. 63) | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 0 | индекс |
- 2-битный день
b00
- 6-битный индекс в массиве индексов цвета:
0..63
Действительный кодер не должен выдавать 2 или более последовательных QOI_OP_INDEX
фрагменты по одному и тому же индексу. QOI_OP_RUN
вместо этого следует использовать.
QOI_OP_DIFF
[ редактировать ]
Байт[0] (диапазон: 64 .. 127) | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 1 | доктор | дг | БД |
- 2-битный день
b01
- 2-битная разница красного канала с предыдущим пикселем
-2..1
- Отличие зеленого канала на 2 бита от предыдущего пикселя
-2..1
- 2-битная разница синего канала с предыдущим пикселем
-2..1
Разница с текущими значениями канала заключается в использовании операции переноса , поэтому 1 - 2
приведет к 255, в то время как 255 + 1
приведет к 0.
Значения сохраняются как целые числа без знака со смещением 2. Например, −2 сохраняется как 0 ( b00
). 1 сохраняется как 3 ( b11
). Значение альфа остается неизменным по сравнению с предыдущим пикселем.
QOI_OP_LUMA
[ редактировать ]
Байт[0] (диапазон: 128 .. 191) | Байт[1] | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 0 | дг | доктор - дг | дб - дг |
- 2-битный день
b10
- Отличие 6-битного зеленого канала от предыдущего пикселя
-32..31
- 4-битная разница красного канала минус разница зеленого канала
-8..7
- 4-битная разница синего канала минус разница зеленого канала
-8..7
Зеленый канал используется для указания общего направления изменения и кодируется 6 битами. Красный и синий каналы (dr и db) основывают свои различия на разнице зеленых каналов. Т.е.:
dr_dg = (cur_px.r - prev_px.r) - (cur_px.g - prev_px.g)
db_dg = (cur_px.b - prev_px.b) - (cur_px.g - prev_px.g)
Разница с текущими значениями канала заключается в использовании операции переноса, поэтому 10 - 13
приведет к 253, в то время как 250 + 7
приведет к 1.
Значения сохраняются как целые числа без знака со смещением 32 для зеленого канала и смещением 8 для красного и синего каналов. Значение альфа остается неизменным по сравнению с предыдущим пикселем.
QOI_OP_RUN
[ редактировать ]
Байт[0] (диапазон: 192 .. 253) | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 1 | бегать |
- 2-битный день
b11
- 6-битная длина серии, повторяющая предыдущий пиксель
Длина серии сохраняется со смещением -1. Обратите внимание, что длины 63 и 64 ( b111110
и b111111
) являются незаконными, поскольку они заняты QOI_OP_RGB
и QOI_OP_RGBA
теги. [13]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б «Сжатие изображений без потерь за время O(n)» . Phoboslab.org . 2021-11-24. Архивировано из оригинала 8 мая 2022 г. Проверено 1 мая 2022 г.
- ^ «QOI Вполне приемлемый формат изображения» . qoiformat.org . 14 декабря 2023 г. Архивировано из оригинала 16 декабря 2023 г. Проверено 14 декабря 2023 г.
- ^ «ImageMagick — Форматы изображений» . Архивировано из оригинала 2 января 2022 года . Проверено 4 мая 2022 г.
- ^ «История изменений/версий IrfanView» . www.irfanview.com . Архивировано из оригинала 14 января 2021 г. Проверено 10 мая 2022 г.
- ^ «Журнал изменений FFmpeg — Gitweb» . ffmpeg.org . Архивировано из оригинала 13 июля 2022 г. Проверено 13 июля 2022 г.
- ^ «Примечания к выпуску GraphicsConverter, версия 11.8 (сборка 5762)» . Программное обеспечение Лемке . Архивировано из оригинала 11 февраля 2023 года . Проверено 21 февраля 2023 г.
- ^ «Релиз v0.76.0» . Майкрософт . Проверено 26 марта 2024 г.
- ^ «Утилита дополнений PowerToys File Explorer для Windows» . Learn.microsoft.com . 04.12.2023 . Проверено 5 февраля 2024 г.
- ^ Джеймс Хейн. «Перемещение изображений на новый уровень» . Почта Бангкока . Проверено 1 апреля 2022 г.
- ^ «Версия 2022.1.0.609» . Примечания к выпуску GameMaker . Йо-йо игры. 26 января 2022 г. . Проверено 26 марта 2024 г.
- ^ «Группы текстур» . Руководство гейммейкера . Йо-йо игры . Проверено 26 марта 2024 г.
- ^ Саймон Шарвуд. «Разработчик создает «вполне приемлемый формат изображения», но он работает лучше, чем просто «хороший» . Регистр . Архивировано из оригинала 2 июня 2023 г. Проверено 30 декабря 2023 г.
- ^ Шаблевски, Доминик (05 января 2022 г.). «Вполне хорошая спецификация формата изображения» (PDF) . Архивировано (PDF) из оригинала 30 апреля 2022 г. Проверено 5 июня 2022 г. В данную статью включен текст из этого источника, находящегося в свободном доступе .
Внешние ссылки [ править ]
- Формат веб-сайта: C. Исходный код и результаты тестов.
- 1 страница PDF-спецификация
- Репозиторий GitHub (включая реализацию C)
- Как работает PNG: компромисс между скоростью и качеством — YouTube Видео, сравнивающее методы сжатия в PNG и QOI с анимацией и примерами.