JPEGの仕組みについて勉強した話【ざっくりとした概観】
どうも初めまして。gaiseと申します。
これからプログラミング関連のことを色々と書いていきたいと思ってます。
言語はc言語を中心にOCaml, Scheme、ハードウェア記述言語ではSystem Verilog
またアセンブラも少し手を出したことがあります。
現在はCUDAも勉強中なのでそのうち記事を書きたいと思います。
今回は5月にJPEGについて勉強してc言語でppmファイルからのエンコーダーを実装したので、JPEGについての解説をいくつかの記事に分けて書きたいと思います。
そもそもJPEGとは
このブログを見ている皆さんは人生で一度は『hoge.jpeg』や『fuga.jpg』のような拡張子がついたファイルを見たことがあると思います。これが一般にJPEGと呼ばれる画像ファイルです。拡張子は『jpg』『jpeg』『jpe』など複数ありますが『jpg』が最も使われていると思います。
JPEGはJoint Photographic Experts Group of CCITT-ISO/IECというCCITT, ISO, ITU-TSの合同組織の略称で、それと同時にこの組織が定めたデジタル静止画像の圧縮符号化方式を表しています。つまりJPEGという組織が決めた圧縮符号化のやり方がJPEGというわけです。なのでJPEGは厳密にはフォーマットの名前ではありません。
フォーマットとして一般的なのは標準のJFIF(Jpeg File Interchange Format)やJFIFの拡張であるEXIF(EXchangeable Image file Format)です。EXIFは画像の作成日時などを記録できるのでデジタルカメラなどで使われています。今回僕が勉強したのはJFIFです。
JPEGにはいくつかの特徴があります。
- 写真の圧縮符号化に向いている
- 圧縮率と復号したときの画像の品質をユーザが調整できる
- 不可逆圧縮である
JPEGの名前にPhotographicとあることからも分かるように、JPEGは写真(特に自然画像)をより効率よく圧縮するために作られました。写真をJPEGで圧縮符号化すると劣化を抑えつつ高い圧縮率を実現することができます。逆に漫画のような人工的な画像をJPEGで圧縮符号化すると劣化が大きくなります。
JPEGをエンコードしたことがある方は分かるかと思いますが、JPEGエンコーダーの多くではエンコード時に圧縮率を決めることができます。当然圧縮率を高くすれば劣化も大きくなりますが、ユーザによってどちらを重視するかは異なる事が多いのでJPEGの利点の一つだと思います。
JPEGは現在広く使われているファイル圧縮方式zipなどとは違い、圧縮(エンコード)したものを展開(デコード)しても圧縮前と同じものは得られません。必ず多少の劣化が生じます。
後ろの二つについては圧縮アルゴリズムに深くかかわってくるので、アルゴリズムの説明記事で詳しく述べます。
今回はこれくらいにして次回からはアルゴリズムについて順に説明したいと思います。