限界までJPEG圧縮したい

ここに何の変哲もない写真がある

まったく同じ写真でも、JPEGの圧縮率を高めるとこうなる。一枚目の写真と比較して、容量は約2/3にまで圧縮できた。スマホで見ると違いが分からないかもしれないので拡大してみると、

汚いノイズが目立っている

JPEGという画像圧縮の規格がある。人間の目には感じにくい情報を削ることで、画質をほとんど変えずにファイル容量を小さくする技術である。

当然ながら、画質と容量はトレードオフの関係にある。高画質を維持すればするほど容量は減らないし、逆に画質劣化を許容すれば、大幅に容量を減らすことができる。

圧縮しすぎるとノイズが出るだけでなく、写真のディテールが失われる

一般に圧縮率を高めるとノイズ（ブロックノイズやモスキートノイズ）が目立つようになる。文字で表現すると「ガビガビ」で「イガイガ」な写真ができあがる。見た目にも汚くなるので、ここまで圧縮する人はあまりいないだろう。

だが、しかし！ この程度の圧縮なんて生ぬるい。実に生ぬるいのだ。

JPEGはまだ本気を出していない。「これ以上いくとヤバい」という自制心が働いている

さらに圧縮しようとすると、「画質が悪くなりすぎるわりに、容量削減の効果が薄い」という領域に達する。要はまだ圧縮しようと思えばできるけれど、あんまりやる意味がないので、バランスを取ってこの程度でやめているのである。

でも気になる。限界まで圧縮すると、どんな画像が出現するのか。

普通のソフトではそんな設定にはできないので、何とか限界まで圧縮できる方法を探ってみた。……とその前に、まずはJPEGの画質を決めるパラメータについて少し理解を深めておきたい。

画質を決めるパラメータを見てみる

JPEGの画質は、パラメータをいじって調整できる。例えば、ほとんどのレタッチソフトでは、画像を保存するときに画質設定のダイアログが出るだろう。

「Photoshop」でJPEG保存するときに出てくる設定画面。0（最低画質）～12（最高画質）の13段階で指定できる

デジカメでも通常、メニューで圧縮率を選択できるようになっている。この機種（SONY RX100M3）では3段階あった

この設定を変えると圧縮率が変わるのだけど、もう少し具体的に言うと「量子化テーブル」という圧縮率を決めるパラメータが変わっている。

これが量子化テーブルで、8x8の計64個のパラメータからなる（実際にはこのテーブルが2つあるのが一般的）。この値はJPEGファイルに埋め込まれているので、簡単に抜き出すことができる

量子化テーブルには計64個のパラメータがあり、それぞれに1～255の値が入っている。ざっくり言うと、この値が小さいほど画質が良く（＝圧縮率が低く）、値が大きいほど画質が悪く（＝圧縮率が高く）なる。

視覚的に分かりやすいよう、以降はこの量子化テーブルの値をグラフで表現する

なんで64個もあるのか、というのを説明するとややこしくなるので、ここでは「そんなもんだ」ということでOKである。なんとなくグラフの「山が低ければ高画質」、逆に「山が高ければ低画質」というのを覚えておいて欲しい。

山が険しければ険しいほど、登るのに体力を消耗して画質が劣化する、というのを頭の中でイメージすればいいかも。

実際に「Photoshop」で画質設定を変えると、この量子化テーブルが変化している。確認してみると……

最高画質と最低画質で、これくらい山の高さが違っていた。ふむふむ

山が高い最低画質の量子化テーブルを使うと、先にお見せしたような「ガビガビ」の画像になる。

でもグラフをよく見て欲しい。縦軸の目盛りが100までしかないことから分かるように、取り得る値が1～255までとは言っても、実際は100未満の値しか使われていない。

ためしに縦軸を最大値の255までにしてみた。すると上の方がガラガラだ

そういうことなのだ。つまり量子化テーブルの山を高くするほど画質は悪く、圧縮率は高くなるのだが、現実的に使える値はこの程度までなのである。

「JPEGはまだ本気を出していない」という意味が分かってもらえただろうか。一般に画質が悪いと言われている圧縮率であっても、パラメータが取り得る値としては十分な余裕があるのだ。

これが分かってくると、「じゃあ量子化テーブルの山をもっともっと高くすると、どんな画質になるのか？」という疑問がわいてくるのも必然であろう。登山家が山頂を目指すように、私の興味も高い山（量子化テーブル）へと向かっていった。

実用に耐えなくてもいい。JPEGにはまだまだ圧縮の余地があるはずだ。がんばれがんばれ。そういう気持ちなのである。

ちなみにデジカメの場合は、かなり画質重視の圧縮である（SONY RX100M3）。しかもモードごとに固定の値じゃなくて、被写体に応じて最適な値に変化するようになっている

いったん広告です

限界までJPEG圧縮できるカメラを作る

パラメータにはまだまだ余裕があると言っても、そんな圧縮ができるソフトなんて存在しない。先に紹介した「Photoshop」の最低画質ですら、かなり攻めた設定なのである。

「もうJPEG圧縮ソフトを自作するしかないかなぁ」と考えていた矢先、ラズパイ（Raspberry Pi）を使えばできることに気が付いた。というより別のことをしているときに偶然発見した。思わずアルキメデスよろしく「エウレカ！」と叫びたくなってしまった。

（詳しい方に向けて書くと、PicameraのAPI ”capture”の引数で、”quality=1”にするとできます）

そんなわけで、ラズパイとカメラ、液晶とモバイルバッテリを組み合わせて、即興でデジカメ（ただし最低の画質）を作ることにした

両面テープを駆使して完成。ただならぬ雰囲気になった

背面にはラズパイと液晶が付いていて、右肩にはシャッター。雑な工作だが、使いごこちは完全にデジカメである

いよいよ肝心の画質を見ていく。これが通常のJPEG写真で、

どーん！ これが最低画質のJPEG写真だ

理論的には、明るさ成分（輝度）は8x8ピクセル、色成分（色差）は16x16ピクセル単位でほぼ塗り潰されてしまうため、パッと見た感じはドット絵である。色ズレも起きていて、これはこれで味わい深い。

でも薄目でみると、それなりに元の雰囲気を残している。不思議な写真である。

量子化テーブルを見ると、山が上端に張り付いていた。これだよ、求めていたものは！

いままでの山とは比べものにならない高さだ。エベレストともちょっと違う。全体が浮き上がっているため、天空の城みたいな雰囲気になっている。

JPEGの規格上、これ以上は圧縮しようがないという限界値である。さすがに画質は見るに耐えないが、期せずして謎のポップさが露呈している。何かしらのフィルタ効果をかけたような見た目であるが、断じてそうではない。ただ限界までJPEG圧縮しただけである。

このカメラをたずさえて、旅に出てみることにした。

どんな風景が撮れるだろうか

いったん広告です

旅する最低画質カメラ

その日わたしは、列車に揺られていた。目指すは、NHKの朝ドラで盛り上がっている、滋賀県・信楽である

JR線で貴生川まで来たあと、「信楽高原鉄道」に乗り換える

信楽高原鉄道ではICカードが使えないため、乗り換えホームにポツンとJRの改札機が置かれていた。ホームの真ん中に改札があるのは異物感がすごい

待つことしばし。やって来た列車は、朝ドラ「スカーレット」のラッピング列車！ ヒロインを演じる戸田恵梨香さんが大きくプリントされている

車内にも焼物のイラストが散りばめられていてかわいい。朝ドラ効果か、列車も観光客で満員だった

約25分で信楽駅に到着。さっそく「信楽たぬき」がお出迎え

さすが信楽である。いたるところに、たぬき！ たぬき！ たぬき！

圧巻だったのは、駅前に鎮座するこの巨大たぬき像。ただの像ではなく、なんと公衆電話なのだ。時節柄、サンタの衣装を着せられていた。地元に愛されている様子がうかがえる

信楽の街を、あてもなく散歩する。山に囲まれた土地である

滋賀といえば「飛び出し坊や」。信楽でもしっかりと飛び出していた

たぬきだけでなく、信楽焼の仏像や壺なども至る所に並べられている。地震が来たら大変なことになりそうだなと、いらぬ心配をしてしまった

やがて新宮神社というところに着いた。参拝していこう

とその前に、社務所で「たぬきみくじ」なるものをゲット。この中におみくじが入っている

運勢は……中吉！ 女子道社製の見慣れたおみくじであった

参拝を済ませて、神社をあとにする

途中で見かけたスーパーカブ。生活感があふれていて良かった

角の「いけず石」の隣にも、信楽たぬき

――やがて帰りの時間が近づいてきた。後ろ髪を引かれつつ駅へと引き返す。ふたたび出会う飛び出し坊や

ありがとう信楽。また遊びに来るよ

という感じだったのである。途中で何やらさっぱり分からない画像が混じっているし、やたらサウンドノベルゲームっぽくなってしまったが、JPEGの圧縮率がMAXなので仕方ない。心の目で見るんだ。

設定できるように実装した人がすごい

最低画質（最高圧縮率）の写真を見ると、とても実用には耐えない画質であることが分かる。「Photoshop」が対応していないのも納得である。

逆にこれができてしまうラズパイ（Picamera）は、一体どうしてしまったのだろう。設定できるように実装した作者の方は、こんな風に誰かが気付いて使かってくれるのを期待していたのかもしれない。もしそうだったら大変おもしろい。

ちなみにファイル容量はというと、掲載してある640x480サイズの場合、正味6キロバイト程度まで圧縮できている（※）。記事中に写真をいっぱい載せているけれど、いわゆる「ギガ」にはやさしい。意外とウェブ向きかもしれない、と一瞬思ったが、たぶん違うな。

※初出時に「通常のJPEG写真の半分以下になった」と書いていましたが、実際にはJPEGファイル内に24キロバイト固定のサムネイル画像が埋め込まれており、それが容量の大部分を占めていました。サムネイルを除くと、正味の圧縮データは約6キロバイトです。お詫びして訂正します。