概要
JPEGとはコンピュータで扱われる静止画像をデジタルデータとして符号化する方式のひとつ。またはそれをつくった組織(ISO/IEC JTC 1/SC 29/WG 1、Joint Photographic Experts Group)の略称である。
拡張子は jpg が多く使われているが、 jpeg 等が使われる場合もある。
特徴
1992年にリリースされ、インターネット上で使われる画像フォーマットとしてはGIF(1987年)に次いで古い。枯れきった技術であることから非常に取り回しが楽で、どんな画像でもそこそこ見られる程度に圧縮できる。このことから、現在でもネットやデジタルカメラなどあらゆる場面で使われている。
しかしながら、非可逆圧縮であるため、JPEGに変換したデータを完全に元データと同一のものに復元することはできない。そのため、何度も編集して上書きを繰り返したりするとノイズが出るなどして画像の劣化が激しくなる。
輪郭線のはっきりしたアニメ絵など、色の境界がくっきりしている画像を圧縮すると、境界付近にノイズが目立ちやすい特徴がある。さらに、白黒やグレースケールなど色数が少ない画像を圧縮してもサイズがあまり小さくならず、圧縮率を極端に上げると、有り得ない色(「偽色」と呼ばれる)が出ることがある。そのため、こうした画像に対してはGIFやPNGなどを使用したほうがよい。
その反面、写真や水彩画調のイラストなどのフルカラー画像では、PNGなどよりもJPEGで保存(圧縮)した方が軽量となる。
またJPEGはアルファチャンネルを持たないので背景を透明にすることができず、背景を透けさせたいロゴやイラストなどにはPNGやGIF、もしくはWebPを使う必要がある(JPEG 2000やHEIFでもよいが対応しているブラウザが少ない)。
歴史
1990年代のインターネット普及初期からGIFとともにWebで盛んに使われた。1999年にGIFの特許問題がクローズアップされると、GIF代替のPNGではなくJPEGのみを使うWebサイトも相次いだ。
その後、WebではPNGも普及したものの、同時期に普及したデジタルカメラではJPEGが標準的なフォーマットとして広がり、JPEG 2000やHEIFなどの次世代規格が登場した現在もデジタル写真の標準フォーマットとしての地位は揺らいでいない。
派生規格
先に「非可逆圧縮」と書いたが、一応規格上は可逆圧縮のJPEG(Lossless JPEG)も定められている。しかし、可逆圧縮のJPEGとは全く圧縮原理が異なる別物であり、これが使われることはまずない。
デジタルカメラで撮影されたJPEG画像は、Exif(Exchangeable image file format)というメタデータが埋め込まれている。GPSを内蔵したカメラやスマートフォンではこのExifデータに撮影場所(ジオタグ)を埋め込むことができる。このせいで思わぬところから個人情報がダダ漏れになる可能性があるので注意(iPhoneではネット上への投稿の際ジオタグを削除する仕様になっているが)。
アニメーション再生を可能にしたMotion JPEGという拡張規格もある(プレイステーションの動画再生はこれ)。
JPEGの策定した後継規格としてJPEG 2000(2000年策定)およびJPEG XR(2009年策定)があるが、いずれも当初の期待ほど普及していない。JPEG 2000は映画の編集や画像のアーカイブ、防犯カメラなど業務用途ではよく使われるが、一般の人が見かけることはあまりないであろう。2018年にJPEGが定めた新しい画像フォーマットであるJPEG XSは従来のJPEGの後継ではなく、ストリーミング配信に特化した規格として企図されている。
原理
JPEGの圧縮は次のように行われる。
前処理
色空間をYCrCb(Y=明るさ、Cr・Cb=色成分)に変換する(あるいはCMYKもある)。この際2つのCについては縦横1/2や横のみ1/2に間引くことが一般的。これをカラーサブサンプリングなどと呼ぶ。これによりベタ塗りの絵では色にじみが発生するため、画質を保ちたい場合はカラーサブサンプリングをしないようにするとよい。
画像を8×8のブロックに分割する。8×8に足りない部分は適当に埋める。
周波数領域に変換
離散コサイン変換(DCT)を行い、画像を周波数領域に変換する。
これにより8×8個の明度/色強度データは8×8種類の波の振幅データに変換される。
勘違いされやすいところだが、この段階で数値は0~255ではなくもっと大きくなっているため、次段階で(一般的には)最大255で除するが必ずしも0にはならない。
量子化
量子化とは、割り算である。
例えば0~255の数値を表すには8bitが必要だが、これを16で割(って切り捨て)ると0~15になり4bitで表せる。
同様に、DCT後のブロック内の64個のデータに対してそれぞれ決められた値で除算を行う。この除数は量子化テーブルと呼ばれ、JPEGのヘッダにはY成分とC成分に対する2つのテーブルにそれぞれ64個の数値(一般的なフォーマットでは1~255)が用意されている。
ジグザグスキャンおよびハフマン符号化
ハフマン符号とは頻度の高いデータに短い符号語を割り当てることにより圧縮するエントロピー符号の一つである。
JPEGではデータそのものに対してハフマン符号化を行うのではなく、データの桁数とそれまでに連続した0の数に対して行う。
例えば16,0,0,0,40であれば「5桁、0個」「6桁、3個」となる(桁数は2進法で)。実際のデータは符号語のあとに最少のbit数で表す。
またこの時8×8のデータを読み出す順番は、左上から右下に向かうジグザグの経路を辿る。画像自体をジグザグスキャンすると勘違いするもの(昔の筆者含む)がいるが、注意されたい。この時点のデータは周波数領域である。
なお、このハフマン符号のテーブルは普通に考えれば画像1枚ごとに最適なものを生成する必要があるが、どんな画像もそこそこ圧縮できるテーブルがあり、それを固定で使うものも多い。横着をせず画像1枚ごとに最適なハフマンテーブルを生成することを一般にJPEGの最適化と呼ぶ。