コンピュータなどで扱われる静止画像のデジタルデータを圧縮する方式のひとつ。またはそれをつくった組織(ISO/IEC JTC 1/SC 29/WG 1、Joint Photographic Experts Group)の略称。JPEG方式による画像ファイルにつけられる拡張子は jpg が多く使われているが、 jpeg 等が使われる場合もある。
特徴
1992年にリリースされ、メジャーな画像フォーマットとしてはGIF(1987年)に次いで古い。ISOで定められた国際標準なのでGIFのような特許問題の心配もなく、インターネットやデジタルカメラなどあらゆる場面で使われる。枯れきった技術であることから非常に取り回しが楽で、どんな画像でもそこそこ見られるように圧縮できる。
ただし、非可逆圧縮であり、元データをJPEGに変換すると劣化は避けられない。特に高い圧縮率で圧縮したり、何度も編集して上書きを繰り返したりすると画質の荒れが激しくなる。圧縮率を極端に上げると、有り得ない色(「偽色」という)やノイズが出たりする。
JPEGで輪郭線のはっきりしたアニメ絵など、色の境界がくっきりしている画像を圧縮すると、ノイズが目立ってしまう。また、白黒やグレースケールなど色数を減らしても画像サイズはあまり小さくならない。そのため、それらの画像の保存にはPNGを使用したほうがよい。その代わり写真や水彩画調のイラストなどのフルカラー画像では、PNGなどよりJPEGのほうが軽量となる。
派生規格
上で「非可逆圧縮」と書いたが、一応規格上は可逆圧縮のJPEG(Lossless JPEG)も定められている。しかし、可逆圧縮のJPEGとは全く圧縮原理が異なる別物であり、これが使われることはまずない。
デジタルカメラで撮影されたJPEG画像は、Exif(Exchangeable image file format)というメタデータが埋め込まれている。GPSを内蔵したカメラやスマートフォンではこのExifデータに撮影場所(ジオタグ)を埋め込むことができる。思わぬところから個人情報がダダ漏れになる可能性があるので注意(iPhoneではネット上への投稿の際ジオタグを削除する仕様になっているが)。
アニメーション再生を可能にしたMotion JPEGという拡張規格もある(プレイステーションの動画再生はこれ)。
後継規格としてJPEG 2000およびJPEG XR、派生規格としてJPEG XSがあるが、いずれも当初の期待ほど普及していない(ただし、JPEG 2000は映画の編集や画像のアーカイブなど業務用途ではよく使われるが、一般の人が見かけることはあまりないであろう)。
原理
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の最適化と呼ぶ。