QOI
8ビットタグ(b11111111、255)
8ビット赤チャンネル値
8ビット緑チャンネル値
8ビット青チャンネル値
8ビットアルファチャンネル値
画像は行ごとに左から右、上から下に符号化が行われる。デコーダとエンコーダは最初のピクセルの前のピクセル値が{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]にバッファとして保持する。このバッファの添え字は、ピクセルのRGBA値にハッシュ関数を適用して得られた値を使用する。
エンコーダでは、インデックスのピクセル値が現在のピクセルと一致する場合、このインデックスの位置はQOI_OP_INDEXとしてストリームに書き込まれる。添え字を計算するハッシュ関数は次の通り:
各チャンクは2ビットまたは8ビットのタグで始まり、それにデータビットが続く。全てのチャンクはバイトアライメントされている。これらのデータビットに符号化された全ての値は左端に最上位ビットがある。8ビットのタグは2ビットのタグよりも優先される。デコーダは最初に8ビットのタグの存在を確認する必要がある。バイトストリームの終端は7個の0x00とそれに続く1個の0x01でマークされる。
チャンクの種類は次の通り: