QOI圧縮を検証


QOI圧縮とは

QOI は Quite OK Image の略らしいです(どうなんですかねこのネーミング)。
先日(2021/12/20)、ファイルフォーマット規定の ver1.0 が発表されました。
https://phoboslab.org/log/2021/12/qoi-specification
このQOI圧縮、なかなか興味深いので掘ってみます。

特徴

この圧縮方式の特徴は、とにかく実行速度が速いこと。ソースを見ればわかりますが、非常にシンプルなプログラムで、一見して「こりゃ速いよね」とわかります。コードも小さいしワークも少ないので、広範囲のIoT機器で実装できそう。ゲーム実装でも有効な場面は多いと思います。

そんな話を適当に流したい、そんな方は
https://voicy.jp/channel/2462/252474
こちらに概要を伝えた10分弱の音声解説を置きました。(BGMは外せます。スマホでVoicyアプリを入れるのがよいでしょう)

実験

githubより

を落として、そこにある qoi.h を #include してね、というそれだけ。Makefileすらありません。その qoi.h もシンプル。このオリジナルはC言語ですが、有志によりすでにさまざまな言語にポーティングされているようです。

サイズ検証

サンプルの qoiconv をビルドして、いくつかの画像を試してサイズを確認しました。
使用した画像は https://samplelib.com/sample-png.htmlいらすとやさんから拝借しています。最後のノイズ画像は自作です。数値はバイト数と圧縮率で、注目すべき圧縮率にで色をつけています。

無圧縮 PNG QOI QOI(pre)
1,440,000
100%
705,670
49%
817,088
56.7%
897,536
62.3%
360,000
100%
195,459
54.3%
256,683
71.3%
266,178
73.9%
360,000
100%
124,864
34.7%
156,769
43.6%
158,766
44.1%
360,000
100%
271,068
75.3%
327,451
91%
359,014
99.7%
360,000
100%
153
0.04%
1,959
0.54%
50
0.01%
2,934,080
100%
386,601
13.2%
375,828
12.8%
384,337
13.1%
1,048,576
100%
1,050,600
100.19%
1,309,682
124.9%
1,306,558
124.6%

いちばん右のカラム QUI(pre) というのは、このフォーマットが規定するひと月ほど前に公開された前バージョンのQOI圧縮です。その時点でも調査していたので併記しました。1.0になってもコンセプトは変わりませんが、実装はかなり変わっていて、圧縮率にも差が出ています。

考察

おおむね、写真のような画像に関してはPNGのほうが圧縮率が高いのがわかります。いっぽうでイラスト調の画像ではQOI圧縮に軍配が上がります。

赤のベタ塗り画像に関してはQOIはかなり負けています。これはQOIの前バージョンと大きく変わったポイントです。ベタ画像はそもそも縮むので、そこで極端に小さくしなくても良かろう、ということでしょう、同意できるところです。

ホワイトノイズに関しては、どの圧縮でも元の画像よりも大きくなりますね。意外とPNGは、ノイズでも大きくなりませんね。

まとめ

圧縮率だけを比較すればPNGなのでしょうけど、encodeも含む速度で有利となると、QOI圧縮の利用範囲は広そうです。画像によってはPNGよりも縮みます。
なにより、この2021年になって新しい画像圧縮が、こんなシンプルな形で登場したことに驚きました。