この記事のトピックは、Wikipediaの一般的な特筆性に関するガイドラインを満たしていない可能性があります。トピックとは ( 2025年7月) |
| かなりOKな画像 | |
|---|---|
| ファイル名拡張子 | .qoi |
| 魔法の数字 | qoif(4バイト、ASCII) |
| 開発者 | ドミニク・ザブレフスキー |
| 初回リリース | 2021年11月24日 |
| 最新リリース | 1.0 2022年1月5日 ( 2022-01-05 ) |
| フォーマットの種類 | ロスレスビットマップ画像形式 |
| 標準 | 仕様 |
| オープンフォーマット? | はい |
| フリーフォーマット? | はい |
| Webサイト | qoiformat.org |
Quite OK Image Format(QOI)は、24ビット( RGB各色8ビット)または32ビット( RGBA各色8ビット、アルファチャンネル8ビット)カラーラスター(ビットマップ)画像のロスレス画像圧縮の仕様であり、Dominic Szablewskiによって発明され、2021年11月24日に初めて発表されました。[ 1 ]
これはオープンソースのロスレス圧縮方式で、 PNGよりも高速で実装も容易です。このフォーマットを発表したブログ記事に記載されている数値によると、PNGと比較して、ファイルサイズが同程度の場合、エンコード速度は20~50倍、デコード速度は3~4倍高速です。[ 1 ]作者は仕様をパブリックドメイン(CC0)に寄贈しました。[ 2 ]
QOIはFFmpeg(v5.1+)、[ 3 ] GIMP(v3.0+)、[ 4 ] GraphicConverter(v11.8+)、[ 5 ] ImageGlass(v8.5+、読み取り専用)、[ 6 ] ImageMagick(v7.1.0-20+)、[ 7 ] Imagine(v1.3.9+)、[ 8 ] IrfanView (v4.60+、プラグイン付き)でサポートされています。[ 9 ] Windows 10および11用のMicrosoft PowerToys (v0.76+)は、ファイルエクスプローラーでQOI画像をプレビューするためのサポートを追加します。[ 10 ] [ 11 ]コミュニティ製のプラグインは、GIMP、Paint.NET、XnView MPで利用できます。[ 12 ]
ゲームエンジンGameMakerは、バージョン2022.1.0.609以降、テクスチャグループのデフォルトの保存形式としてbzip2とQOIの組み合わせを使用しています。この形式のファイルは、置き換えたPNG形式よりもサイズが小さいにもかかわらず、解凍速度が高速です。また、GameMakerは解凍パフォーマンスを向上させるプレーンQOIと、ツールやウェブプラットフォームとの互換性を確保するためのPNGも提供しています。[ 13 ] [ 14 ]
Rust、Python、Java、C++、C#など様々な言語の実装もあります。[ 15 ]完全なリストはプロジェクトのGit(Hub)リポジトリのREADMEにあります。
QOI ファイルは、14 バイトのヘッダー、それに続く任意の数のデータ「チャンク」、および 8 バイトの終了マーカーで構成されます。
qoi_header { char magic [ 4 ]; // マジックバイト "qoif" uint32_t width ; // 画像の幅(ピクセル単位)(BE)uint32_t height ; // 画像の高さ(ピクセル単位)(BE)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)QOI_OP_DIFF前のピクセル値とのr、g、b(またはQOI_OP_LUMA)の差QOI_OP_RGBまたはQOI_OP_RGBA)カラーチャンネルはアルファチャンネルと事前乗算されないものと想定されます(「事前乗算なしアルファ」)。array[64]エンコーダーとデコーダーは、以前に検出されたピクセル値(ゼロ初期化)を連続的に保持します。エンコーダーとデコーダーによって検出された各ピクセルは、カラー値の ハッシュ関数によって生成された位置のこの配列に格納されます。
エンコーダでは、インデックスのピクセル値が現在のピクセルと一致する場合、このインデックス位置が としてストリームに書き込まれますQOI_OP_INDEX。インデックスのハッシュ関数は次のとおりです。
インデックス位置= ( r * 3 + g * 5 + b * 7 + a * 11 ) % 64各チャンクは2ビットまたは8ビットのタグで始まり、その後にいくつかのデータビットが続きます。チャンクのビット長は8で割り切れます。つまり、すべてのチャンクはバイトアラインメントされています。これらのデータビットにエンコードされたすべての値は、最上位ビットが左側にあります。8ビットタグは2ビットタグよりも優先されます。デコーダーはまず8ビットタグの存在を確認する必要があります。バイトストリームの終わりは、70x00バイトとそれに続く10x01バイトで示されます。
可能なチャンクは次のとおりです。
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 | 赤 | 緑 | 青 |
b11111110(254)アルファ値は前のピクセルから変更されません。
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 | 赤 | 緑 | 青 | アルファ |
b11111111(255)QOI_OP_INDEX| バイト[0] (範囲: 0 .. 63) | |||||||
|---|---|---|---|---|---|---|---|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0 | 索引 | |||||
b000..63有効なエンコーダーは、QOI_OP_INDEX 同じインデックスに 2 つ以上の連続したチャンクを発行してはなりません。QOI_OP_RUN代わりに を使用する必要があります。
QOI_OP_DIFF| バイト[0] (範囲: 64 .. 127) | |||||||
|---|---|---|---|---|---|---|---|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 1 | 博士 | dg | デシベル | |||
b01-2..1-2..1-2..1現在のチャネル値との差はラップアラウンド演算を使用しているため、1 - 2は 255 になり、 は255 + 10 になります。
値はバイアス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 | dg | dr - dg | デシベル - デジグラム | |||||||||||
b10-32..31-8..7-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 | 走る | |||||
b11ランレングスはバイアス-1で保存されます。ランレングス63と64(b111110および)は、タグとタグb111111によって占有されているため、不正であることに注意してください。[ 16 ]QOI_OP_RGBQOI_OP_RGBA
開発者のDominic Szablewski氏は、従来のファイル形式が複雑で、経済的な理由から[ 17 ]有料化されており、他のファイル形式は依然として非常に複雑であったり、独自仕様であったりすることを認識していました。彼は、パフォーマンスのために圧縮率を下げた、よりシンプルなファイル形式を作成する必要があると感じ、当初は新しいビデオコーデックの開発に取り組み、代わりにQOIの初期バージョンを作成しました。[ 1 ]ファイル形式がGitHubユーザーから精査されている間、作成者は形式を複雑にする提案を積極的に拒否しました。[ 18 ]ファイル形式は最終決定されたため、これ以上の改良は行われません。[ 19 ]