この記事のトピックは、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)の差- 完全な 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
歴史
開発者のドミニク・ザブレフスキーは、従来のファイル形式が複雑で、経済的な理由から[17]、有料である一方、他のファイル形式は依然として非常に複雑であったり、独自仕様であったりすることを認識していました。彼は、パフォーマンスのために圧縮率を下げた、よりシンプルなファイル形式の必要性を感じ、当初は新しいビデオコーデックの開発に着手し、代わりにQOIの初期バージョンを開発しました。[1]ファイル形式がGitHubユーザーから精査されている間、作成者は形式を複雑にする提案を積極的に却下しました。[18]ファイル形式は最終決定されたため、これ以上の改良は行われません。[19]
参考文献
- ^ abc 「O(n)時間でのロスレス画像圧縮」Phoboslab.org . 2021年11月24日. 2022年5月8日時点のオリジナルよりアーカイブ。2022年5月1日閲覧。
- ^ “QOI The Quite OK Image Format”. qoiformat.org . 2023年12月14日. 2023年12月16日時点のオリジナルよりアーカイブ。2023年12月14日閲覧。
- ^ “FFmpeg Changelog - Gitweb”. ffmpeg.org . 2022年7月13日時点のオリジナルよりアーカイブ。2022年7月13日閲覧。
- ^ 「GIMP 3.0 リリースノート」。GIMPチーム。 2025年3月18日閲覧。
- ^ “GraphicConverter リリースノート バージョン 11.8 (ビルド 5762)”. Lemke Software . 2023年2月11日時点のオリジナルよりアーカイブ。2023年2月21日閲覧。
- ^ 「ImageGlass 8.5を発表」Duong Dieu Phap. 2022年1月22日. 2025年3月14日閲覧。
- ^ “Changelog”. ImageMagick . 2025年3月14日閲覧。
- ^ 「Imagine - What's new?」Sejin Chun . 2025年3月14日閲覧。
- ^ “IrfanViewの変更履歴/バージョン”. www.irfanview.com . 2021年1月14日時点のオリジナルよりアーカイブ。2022年5月10日閲覧。
- ^ 「リリース v0.76.0」。Microsoft . 2024年3月26日閲覧。
- ^ 「Windows用PowerToysファイルエクスプローラーアドオンユーティリティ」. learn.microsoft.com . 2023年12月4日. 2024年2月5日閲覧。
- ^ James Hein (2022年3月16日). 「Moving images to the next level」. Bangkok Post . 2022年4月1日閲覧。
- ^ “バージョン 2022.1.0.609”. GameMaker リリースノート. YoYo Games. 2022年1月26日. 2024年3月26日閲覧。
- ^ 「テクスチャグループ」。GameMakerマニュアル。YoYo Games 。 2024年3月26日閲覧。
- ^ Simon Sharwood. 「開発者が『かなりOKな画像フォーマット』を開発 ― しかし、パフォーマンスはただOKというレベルを超えている」The Register . 2023年6月2日時点のオリジナルよりアーカイブ。 2023年12月30日閲覧。
- ^ Szablewski, Dominic (2022年1月5日). 「The Quite OK Image Format Specification」(PDF) . 2022年4月30日時点のオリジナルよりアーカイブ(PDF) . 2022年6月5日閲覧。
この記事には、パブリック ドメインであるこのソースからのテキストが組み込まれています。
- ^ Szablewski, Dominic. 「O(n)時間でのロスレス画像圧縮」. PhobosLab . 2025年9月21日閲覧。
- ^ Szablewski, Dominic. 「QOIファイルフォーマット仕様」. PhobosLab . 2025年9月21日閲覧。
- ^ 「QOI - 高速でロスレスな画像圧縮を実現する「Quite OK Image Format」」GitHub . 2025年9月21日閲覧。
外部リンク
- フォーマットウェブサイト: C ソースコードとベンチマーク結果
- 1ページのPDF仕様
- GitHubリポジトリ(C実装を含む)
- PNG の仕組み: 速度と品質の両立 - YouTube アニメーションと例を使用して PNG と QOI の圧縮手法を比較するビデオ。