LoginSignup
16
6

More than 1 year has passed since last update.

QOI圧縮を検証

Last updated at Posted at 2021-12-22

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)
image.png 1,440,000
100%
705,670
49%
817,088
56.7%
897,536
62.3%
image.png 360,000
100%
195,459
54.3%
256,683
71.3%
266,178
73.9%
image.png 360,000
100%
124,864
34.7%
156,769
43.6%
158,766
44.1%
image.png 360,000
100%
271,068
75.3%
327,451
91%
359,014
99.7%
image.png 360,000
100%
153
0.04%
1,959
0.54%
50
0.01%
image.png 2,934,080
100%
386,601
13.2%
375,828
12.8%
384,337
13.1%
image.png 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年になって新しい画像圧縮が、こんなシンプルな形で登場したことに驚きました。

16
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
6