QOI(画像形式)

かなりOKな画像
ファイル名拡張子
.qoi
魔法の数字qoif(4バイト、ASCII)
開発者ドミニク・ザブレフスキー
初回リリース2021年11月24日
最新リリース
1.0 2022年1月5日 ( 2022-01-05 )
フォーマットの種類ロスレスビットマップ画像形式
標準仕様
オープンフォーマット?はい
フリーフォーマット?はい
Webサイトqoiformat.org

Quite OK Image FormatQOI)は、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 ]コミュニティ製のプラグインはGIMPPaint.NETXnView MPで利用できます。[ 12 ]

ゲームエンジンGameMakerは、バージョン2022.1.0.609以降、テクスチャグループのデフォルトの保存形式としてbzip2とQOIの組み合わせを使用しています。この形式のファイルは、置き換えたPNG形式よりもサイズが小さいにもかかわらず、解凍速度が高速です。また、GameMakerは解凍パフォーマンスを向上させるプレーンQOIと、ツールやウェブプラットフォームとの互換性を確保するためのPNGも提供しています。[ 13 ] [ 14 ]

RustPythonJavaC++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)の差
  • 完全な r,g,b または r,g,b,a 値 (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
  • 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

有効なエンコーダーは、QOI_OP_INDEX 同じインデックスに 2 つ以上の連続したチャンクを発行してはなりません。QOI_OP_RUN代わりに を使用する必要があります。

QOI_OP_DIFF

バイト[0] (範囲: 64 .. 127)
7 6 5 4 3 2 1 0
0 1 博士 dg デシベル
  • 2ビットタグb01
  • 前のピクセルからの2ビット赤チャンネルの差-2..1
  • 前のピクセルからの2ビット緑チャンネルの差-2..1
  • 前のピクセルからの2ビットの青チャンネルの差-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 デシベル - デジグラム
  • 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によって占有されているため、不正であることに注意してください。[ 16 ]QOI_OP_RGBQOI_OP_RGBA

歴史

開発者のDominic Szablewski氏は、従来のファイル形式が複雑で、経済的な理由から[ 17 ]有料化されており、他のファイル形式は依然として非常に複雑であったり、独自仕様であったりすることを認識していました。彼は、パフォーマンスのために圧縮率を下げた、よりシンプルなファイル形式を作成する必要があると感じ、当初は新しいビデオコーデックの開発に取り組み、代わりにQOIの初期バージョンを作成しました。[ 1 ]ファイル形式がGitHubユーザーから精査されている間、作成者は形式を複雑にする提案を積極的に拒否しました。[ 18 ]ファイル形式は最終決定されたため、これ以上の改良は行われません。[ 19 ]

参考文献

  1. ^ a b c「O(n)時間でのロスレス画像圧縮」 . Phoboslab.org . 2021年11月24日. 2022年5月8日時点のオリジナルよりアーカイブ。2022年5月1日閲覧。
  2. ^ “QOI The Quite OK Image Format” . qoiformat.org . 2023年12月14日. 2023年12月16日時点のオリジナルよりアーカイブ2023年12月14日閲覧。
  3. ^ “FFmpeg Changelog - Gitweb” . ffmpeg.org . 2022年7月13日時点のオリジナルよりアーカイブ2022年7月13日閲覧。
  4. ^ 「GIMP 3.0 リリースノート」 . GIMPチーム. 2025年3月18日閲覧
  5. ^ 「GraphicConverter リリースノート バージョン 11.8 (ビルド 5762)」 . Lemke Software . 2023年2月11日時点のオリジナルよりアーカイブ2023年2月21日閲覧。
  6. ^ 「ImageGlass 8.5を発表」 Duong Dieu Phap. 2022年1月22日. 2025年3月14日閲覧
  7. ^ 「Changelog」 . ImageMagick . 2025年3月14日閲覧
  8. ^ 「Imagine - What's new?」 Sejin Chun . 2025年3月14日閲覧
  9. ^ 「IrfanViewの変更履歴/バージョン」www.irfanview.com。 2021年1月14時点のオリジナルよりアーカイブ2022年5月10日閲覧。
  10. ^ 「リリース v0.76.0」。Microsoft 。 2024年3月26日閲覧
  11. ^ 「Windows用PowerToysファイルエクスプローラーアドオンユーティリティ」 . learn.microsoft.com . 2023年12月4日. 2024年2月5日閲覧
  12. ^ James Hein (2022年3月16日). 「動く画像を次のレベルへ」 . Bangkok Post . 2022年4月1日閲覧
  13. ^ 「バージョン 2022.1.0.609」 . GameMaker リリースノート. YoYo Games. 2022年1月26日. 2024年3月26日閲覧
  14. ^ 「テクスチャグループ」 . GameMakerマニュアル. YoYo Games . 2024年3月26日閲覧
  15. ^ Simon Sharwood. 「開発者が『かなりOKな画像フォーマット』を開発 ― しかし、パフォーマンスはただOKというだけではない」 The Register . 2023年6月2日時点のオリジナルよりアーカイブ。 2023年12月30日閲覧
  16. ^ Szablewski, Dominic (2022年1月5日). 「The Quite OK Image Format Specification」(PDF) . 2022年4月30日時点のオリジナルよりアーカイブ(PDF) . 2022年6月5日閲覧パブリックドメインこの記事には、パブリック ドメインであるこのソースからのテキストが組み込まれています。
  17. ^ Szablewski, Dominic. 「O(n)時間でのロスレス画像圧縮」 . PhobosLab . 2025年9月21日閲覧
  18. ^ Szablewski, Dominic. 「QOIファイルフォーマット仕様」 . PhobosLab . 2025年9月21日閲覧
  19. ^ 「QOI - 高速でロスレスな画像圧縮を実現する「Quite OK Image Format」」GitHub2025年9月21日閲覧