(Translated by https://www.hiragana.jp/)
QOI - Wikipedia コンテンツにスキップ

QOI

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
Quite OK Image
拡張子かくちょうし.qoi
マジック
ナンバー
qoif(4バイト、ASCII)
開発かいはつしゃドミニク・シャブレフスキ
初版しょはん2021ねん11月24にち (2ねんまえ) (2021-11-24)
最新さいしんばん
1.0
(2022ねん1がつ5にち (2ねんまえ) (2022-01-05))
種別しゅべつ可逆かぎゃくビットマップ画像がぞうファイルフォーマット
国際こくさい標準ひょうじゅん仕様しよう
オープン
フォーマット
Yes
ウェブサイトqoiformat.org ウィキデータを編集

QOIQuite OK Image Format)は、ドミニク・シャブレフスキ(ポーランド: Dominic Szablewski)によって開発かいはつされ2021ねん11月24にちはじめて発表はっぴょうされた24ビット[注釈ちゅうしゃく 1]または32ビット[注釈ちゅうしゃく 2]カラービットマップ(ラスター)画像がぞう可逆かぎゃく画像がぞう圧縮あっしゅく仕様しようである[1]

概要がいよう

[編集へんしゅう]

計画けいかくされた目標もくひょうは、PNGよりも実装じっそう簡単かんたん高速こうそく処理しょりができるオープンソース可逆かぎゃく圧縮あっしゅく方式ほうしき作成さくせいすることであった。第三者だいさんしゃによるYouTubeの動画どうがでは、PNGとQOIの圧縮あっしゅくがどのようにおこなわれるかについて説明せつめいしている[2]作者さくしゃによる最初さいしょ発表はっぴょうとこの動画どうがでは、同様どうようのファイルサイズのPNGと比較ひかくした場合ばあい、エンコードは20ばいから50ばいはやく、デコードは3ばいから4ばいはやいと主張しゅちょうしている[1]作者さくしゃはQOIの仕様しようパブリックドメインCC0)であると宣言せんげんした。

ソフトウェアとプログラミング言語げんご対応たいおう

[編集へんしゅう]

QOIはImageMagick[3]IrfanView(バージョン4.60以降いこう[4]FFmpeg(バージョン5.1以降いこう[5]およGraphicconverter(バージョン11.8以降いこう[6]がネイティブに対応たいおうしている。

コミュニティが作成さくせいしたプラグインGIMPPaint.NETおよXnView利用りようすることができる[7]

RustPythonJavaC++C#などのプログラミング言語げんごけの実装じっそう存在そんざいする[注釈ちゅうしゃく 3][8]

ファイルフォーマット

[編集へんしゅう]

QOIファイルは14バイトのヘッダと、それにつづ任意にんいかずのデータチャンクと8バイトの終端しゅうたんマーカーで構成こうせいされる。

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指定していされたすべてのピクセル処理しょりされると画像がぞう完成かんせいする。ピクセルはつぎのように符号ふごうされる:

カラーチャンネルはアルファチャンネルと乗算じょうざんみでないと想定そうていされる。エンコーダとデコーダは過去かこ出現しゅつげんしたピクセルをゼロ初期しょきされたarray[64]にバッファとして保持ほじする。このバッファのは、ピクセルのRGBAハッシュ関数かんすう適用てきようしてられた使用しようする。

エンコーダでは、インデックスのピクセル現在げんざいのピクセルと一致いっちする場合ばあい、このインデックスの位置いちQOI_OP_INDEXとしてストリームにまれる。計算けいさんするハッシュ関数かんすうつぎとおり:

index_position = (r * 3 + g * 5 + b * 7 + a * 11) % 64

かくチャンクは2ビットまたは8ビットのタグではじまり、それにデータビットがつづく。すべてのチャンクはバイトアライメントされている。これらのデータビットに符号ふごうされたすべての左端ひだりはしさい上位じょういビットがある。8ビットのタグは2ビットのタグよりも優先ゆうせんされる。デコーダは最初さいしょに8ビットのタグの存在そんざい確認かくにんする必要ひつようがある。バイトストリームの終端しゅうたんは70x00とそれにつづ1個いっこ0x01でマークされる。

チャンクの種類しゅるいつぎとおり:

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ビットあおチャンネル

アルファまえのピクセルから変更へんこうされない。

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](範囲はんい: 0 .. 63)
7 6 5 4 3 2 1 0
0 0 インデックス
  • 2ビットタグ(b00
  • 6ビット0..63

有効ゆうこうなエンコーダはおなじインデックスにたいして2以上いじょう連続れんぞくしたQOI_OP_INDEXチャンクをしてはならない。わりにQOI_OP_RUN使用しようする必要ひつようがある。

Byte[0](範囲はんい: 64 .. 127)
7 6 5 4 3 2 1 0
0 1 あかチャンネル差分さぶん みどりチャンネル差分さぶん あおチャンネル差分さぶん
  • 2ビットタグ(b01
  • 直前ちょくぜんのピクセルのあかチャンネルとの差分さぶん(2ビット、-2..1
  • 直前ちょくぜんのピクセルのみどりチャンネルとの差分さぶん(2ビット、-2..1
  • 直前ちょくぜんのピクセルのあおチャンネルとの差分さぶん(2ビット、-2..1

現在げんざいのチャンネルとの差分さぶん計算けいさんにはラップアラウンド演算えんざん英語えいごばん使用しようされているので、1 - 2結果けっかは255となり、255 + 1結果けっかは0となる。

はエクセス2で表現ひょうげんされる符号ふごう整数せいすうとして保存ほぞんされる。たとえば、−2は0(b00)として保存ほぞんされ、1は3(b11)として保存ほぞんされる。アルファまえのピクセルから変更へんこうされない。

Byte[0](範囲はんい: 128 .. 191) 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

みどりチャンネルは一般いっぱんてき変化へんか方向ほうこうしめすために使用しようされ、6ビットで符号ふごうされる。あかチャンネルとあおチャンネルはこれらとみどりチャンネルとの差分さぶんもとづいて符号ふごうされる。つまり:

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で表現ひょうげんされる符号ふごう整数せいすうとして保存ほぞんされる。アルファまえのピクセルから変更へんこうされない。

Byte[0](範囲はんい: 192 .. 253)
7 6 5 4 3 2 1 0
1 1 ランレングス
  • 2ビットタグ(b11
  • 直前ちょくぜんのピクセルをかえすランレングス(6ビット)

ランレングスはエクセス−1で保存ほぞんされる。ランレングス63と64(b111110b111111)はQOI_OP_RGBタグとQOI_OP_RGBAタグによって占有せんゆうされているので、不正ふせいであることに注意ちゅうい[9]

脚注きゃくちゅう

[編集へんしゅう]

注釈ちゅうしゃく

[編集へんしゅう]
  1. ^ かくいろがそれぞれ8ビットいろ深度しんどRGB
  2. ^ 8ビットのアルファチャンネルかくいろがそれぞれ8ビットのいろ深度しんどつRGBA。
  3. ^ 完全かんぜん一覧いちらんプロジェクトのリポジトリのREADME参照さんしょう

出典しゅってん

[編集へんしゅう]
  1. ^ a b Lossless Image Compression in O(n) Time”. Phoboslab.org (2021ねん11月24にち). 2022ねん5がつ1にち閲覧えつらん
  2. ^ Reducible (2022ねん3がつ3にち). “How PNG Works: Compromising Speed for Quality”. YouTube.com. 2022ねん5がつ1にち閲覧えつらん
  3. ^ ImageMagick - Image Formats”. 2022ねん5がつ4にち閲覧えつらん
  4. ^ History of IrfanView Changes/Versions”. www.irfanview.com. 2022ねん5がつ10日とおか閲覧えつらん
  5. ^ FFmpeg Changelog - Gitweb”. ffmpeg.org. 2022ねん7がつ13にち閲覧えつらん
  6. ^ GraphicConverter Release Notes version 11.8 (build 5762)”. Lemke Software. 2023ねん2がつ21にち閲覧えつらん
  7. ^ James Hein. “Moving images to the next level”. Bangkok Post. https://www.bangkokpost.com/tech/2279999/moving-images-to-the-next-level 2022ねん4がつ1にち閲覧えつらん 
  8. ^ Simon Sharwood. “Developer creates ‘Quite OK Image Format’ – but it performs better than just OK”. The Register. https://www.theregister.com/2021/12/21/quite_ok_image_format/ 
  9. ^ Szablewski, Dominic (2022ねん1がつ5にち). “The Quite OK Image Format Specification”. 2022ねん6がつ5にち閲覧えつらん この記事きじには現在げんざいパブリックドメインとなったつぎ出版しゅっぱんぶつからの記述きじゅつふくまれています。

外部がいぶリンク

[編集へんしゅう]