コンピュータなどで扱われる静止画像のデジタルデータを圧縮する方式のひとつ。またはそれをつくった組織(ISO/IEC JTC 1/SC 29/WG 1、Joint Photographic Experts Group)の略称。JPEG方式による画像ファイルにつけられる拡張子は jpg が多く使われているが、 jpeg 等が使われる場合もある。
非可逆圧縮であり、元データをJPEGに変換すると劣化は避けられない。特に高い圧縮率で圧縮したり、何度も編集して上書きを繰り返したりすると画質の荒れが激しくなる。圧縮率を上げると、有り得ない色(「偽色」という)やノイズが出たりする。
ベタ塗りしたイラストなど、色の境がくっきりしている画像を圧縮すると、ノイズが目立ってしまうため、PNGやGIFを使用したほうがよい。その代わり写真などのデータでは、PNGなどよりJPEGのほうが軽量となる。
アニメーション再生を可能にしたMotion JPEGという拡張規格もある。後継規格としてJPEG 2000およびJPEG XRがあるが、あまり普及していない。
概要
JPEGの圧縮は次のように行われる。
前処理
色空間をYCrCbに変換する(あるいは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の最適化と呼ぶ。