QOI
![]() | この |
![]() | |
.qoi | |
マジック ナンバー | qoif (4バイト、ASCII) |
ドミニク・シャブレフスキ | |
2021 | |
1.0 (2022 | |
オープン フォーマット | Yes |
ウェブサイト | qoiformat |
QOI(Quite OK Image Format)は、ドミニク・シャブレフスキ(ポーランド
概要
[ソフトウェアとプログラミング言語 の対応
[QOIはImageMagick[3]、IrfanView(バージョン4.60
コミュニティが
Rust、Python、Java、C++、C#などのプログラミング
ファイルフォーマット
[ヘッダ
[QOIファイルは14バイトのヘッダと、それに
qoi_header {
char magic[4]; // マジックナンバー(qoif)
uint32_t width; // 画像 の幅 (ビッグエンディアン)
uint32_t height; // 画像 の高 さ(ビッグエンディアン)
uint8_t channels; // 3 = RGB、4 = RGBA
uint8_t colorspace; // 0 = 線形 アルファチャンネル付 きsRGB
// 1 = 全 てのチャンネルが線形
};
符号 化
[{r: 0, g: 0, b: 0, a: 255}
であるとしてwidth * height
で
直前 のピクセル値 に基 づく連 長 圧縮 (QOI_OP_RUN
)以前 のピクセル値 に基 づく辞書 式 圧縮 法 (QOI_OP_INDEX
)直前 のピクセルのRGB値 に基 づく差分 符号 化 (QOI_OP_DIFF
またはQOI_OP_LUMA
)完全 なRGB値 またはRGBA値 (QOI_OP_RGB
またはQOI_OP_RGBA
)
カラーチャンネルはアルファチャンネルとarray[64]
にバッファとして
エンコーダでは、インデックスのピクセルQOI_OP_INDEX
としてストリームに
index_position = (r * 3 + g * 5 + b * 7 + a * 11) % 64
0x00
とそれに0x01
でマークされる。
チャンクの
QOI_OP_RGB
[Byte[0] | Byte[1] | Byte[2] | Byte[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
[Byte[0] | Byte[1] | Byte[2] | Byte[3] | Byte[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
[Byte[0]( | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 0 | インデックス |
- 2ビットタグ(
b00
) - 6ビット
添 え字 (0..63
)
QOI_OP_INDEX
チャンクをQOI_OP_RUN
を
QOI_OP_DIFF
[Byte[0]( | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 1 |
- 2ビットタグ(
b01
) 直前 のピクセルの赤 チャンネルとの差分 値 (2ビット、-2..1
)直前 のピクセルの緑 チャンネルとの差分 値 (2ビット、-2..1
)直前 のピクセルの青 チャンネルとの差分 値 (2ビット、-2..1
)
1 - 2
の255 + 1
の
b00
)としてb11
)として
QOI_OP_LUMA
[Byte[0]( |
Byte[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
)
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
の250 + 7
の
QOI_OP_RUN
[Byte[0]( | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 1 | ランレングス |
- 2ビットタグ(
b11
) 直前 のピクセルを繰 り返 すランレングス(6ビット)
ランレングスはエクセス−1でb111110
とb111111
)はQOI_OP_RGB
タグとQOI_OP_RGBA
タグによって
脚注
[注釈
[出典
[- ^ a b “Lossless Image Compression in O(n) Time”. Phoboslab.org (2021
年 11月24日 ). 2022年 5月 1日 閲覧 。 - ^ Reducible (2022
年 3月 3日 ). “How PNG Works: Compromising Speed for Quality”. YouTube.com. 2022年 5月 1日 閲覧 。 - ^ “ImageMagick - Image Formats”. 2022
年 5月 4日 閲覧 。 - ^ “History of IrfanView Changes/Versions”. www.irfanview.com. 2022
年 5月 10日 閲覧 。 - ^ “FFmpeg Changelog - Gitweb”. ffmpeg.org. 2022
年 7月 13日 閲覧 。 - ^ “GraphicConverter Release Notes version 11.8 (build 5762)”. Lemke Software. 2023
年 2月 21日 閲覧 。 - ^ James Hein. “Moving images to the next level”. Bangkok Post 2022
年 4月 1日 閲覧 。 - ^ Simon Sharwood. “Developer creates ‘Quite OK Image Format’ – but it performs better than just OK”. The Register
- ^ Szablewski, Dominic (2022
年 1月 5日 ). “The Quite OK Image Format Specification”. 2022年 6月 5日 閲覧 。この
記事 には現在 パブリックドメインとなった次 の出版 物 からの記述 が含 まれています。