blog

JPEG/Exif/TIFFフォーマットの解釈(1):JEPG画像圧縮と保存原理の解析

JPEGのフルネームは、それは一般的に使用される画像ストレージフォーマットであり、jpg/jpegは、24ビットの画像ファイル形式であり、また、高効率の圧縮形式であり、ファイル形式は、JPEG規格の製...

Jan 14, 2021 · 13 min. read
シェア

JPEGファイル入門

JPEGのフルネームは、それは一般的に使用されるイメージストレージフォーマットです。 jpg / JPEGは、24ビットのイメージファイル形式と非常に効率的な圧縮形式であり、ファイル形式は、国際電気通信連合、国際標準化機構、および国際電気標準会議によって開発されたイメージ圧縮規格であるJPEG規格の製品です。JPEG規格は、正式にはISO / IECIS10918-1:連続階調静止イメージのデジタル圧縮および符号化、ITU-T勧告T.81.

本来の目的は、64Kbpsの通信回線を使い、720×576の解像度で圧縮イメージを伝送することでした。解像度をほとんど落とさないことで、イメージに必要なストレージの量を元のサイズの10%まで減らすことができます。その高い圧縮効率と標準化の必要性から、現在ではカラーファックス、静止画、電話会議、印刷、ニュース写真の伝送に広く使われています。ただし、削除されたデータは解凍時に復元できないため、* .jpg/.jpegファイルは拡大表示には適さず、印刷出力時の画質にも影響します。

JPEGファイル形式

JPEGファイル形式は、一般的に2つのファイル拡張子があります:.jpgと.jpeg、これらの2つの拡張子の本質は同じです、あなたは.jpgファイルを.jpegにリネームすることができ、ファイル自体は何の影響もありません。厳密に言えば、JPEGのファイル拡張子は.jpegであるべきですが、DOS時代の8.3ファイル名命名原則のため、.jpgの拡張子が使用され、この状況は.htmと.htmlの違いに似ています。

JPEG規格は固有のファイル形式を規定していません。ビットストリームを圧縮するための構文を定義しているだけです。このため、JPEGファイル交換フォーマット、TIFF6.0へのJPEG拡張、FlashPixなど、JPEG圧縮イメージを保存するためのファイルフォーマットがいくつか存在します。しかし、これらはいずれも、国際標準化委員会によって正式に定義された国際標準とは言えません。

JPEGフォーマットは、3つのフォーマットに分類することができます。

標準JPEG:このタイプのイメージファイルは、ウェブ上でより一般的に使用され、イメージが完全に読み込まれ、読み込まれた後にのみ、その全体を見ることができます。これは、イメージを圧縮する非常に柔軟な方法であり、ユーザーは圧縮比と画質をトレードオフすることができます。ただし、一般的に圧縮率は10:1から40:1の間で、圧縮率が高いほど画質が悪く、圧縮率が低いほど画質が良くなります。JPEGはインターネット上のアプリケーションに適しており、イメージの伝送時間を短縮することができ、24ビットのトゥルーカラーをサポートすることができ、また、連続階調を必要とするイメージに一般的に使用されています。jpegは、それが供給することができるように、他の伝統的な圧縮アルゴリズムに匹敵しない圧縮率を達成することができます。圧縮モードは次のとおりです:

JPEG圧縮ステップ

  1. JPEGはYUVカラーモードのみをサポートしており、RGBカラーモードはサポートしていないため、カラーイメージを圧縮する前にカラーモードを変換する必要があります。変換が完了すると、データのサンプリングも必要になります。一般的なサンプリング比率は2:1:1または4:2:2です。この作業の後、2行のデータごとに1行だけが保持されるため、サンプリングされたイメージデータ量は元の半分に圧縮されます。

  2. DCTは、イメージ信号を周波数領域で変換し、高周波と低周波の情報を分離するプロセスです。次に、イメージの高周波数部分を圧縮してイメージデータを圧縮します。イメージはまず複数の8*8行列に分割されます。次に、DCT変換を各行列に適用します。変換の結果、周波数係数の行列ができ、周波数係数は浮動小数点数です。

  3. 後の符号化処理で使用されるコードブックは整数であるため、変換された周波数係数は量子化され、整数に変換される必要があります。データの量子化の結果、行列内のデータは近似値となり、元のイメージデータとの間に差が生じます。この差がイメージ圧縮後の歪みの主な原因です。

  4. 符号化には、0値ストローク長符号化とエントロピー符号化の2つのメカニズムが用いられます。JPEGでは、曲線配列が使用されます。すなわち、行列の対角線に垂直なジグザグ方向に行列の要素が配置されます。この利点は、行列の左上隅に近い要素は、トリップの前に配置された大きな要素の値であり、トリップの後ろに配置された行列要素は基本的に0の値であるということです。トリップ長の符号化は非常にシンプルでよく使われる符号化方法なので、ここでは繰り返しません。符号化は実際には統計的性質に基づく符号化方法です。JPEGではHUFFMAN符号化や算術符号化が認められています。

詳しくは、「色空間RGB/CMYK/HSL/HSB/HSV/Lab/YUVの基礎理論と変換方式:RGBとYUV」、 」をご参照ください。

このタイプの JPEG ファイルは、上から下への走査方式で、各行が順次 JPEG ファイルに保存されます。このファイルを開いて内容を表示すると、データは上から下に保存された順に表示され、すべてのデータが読み込まれると、イメージ全体の表示が完了します。この種のイメージは、イメージの幅と高さを指定しないと、ウェブ上で再描画が発生します。

: JPEGファイルには複数のスキャンが含まれており、それらはスムーズな方法でJPEGファイルに保存されます。ファイルを開くと、まずイメージ全体のぼやけた輪郭が表示され、スキャン回数が増えるにつれてイメージが鮮明になっていきます。このタイプのイメージは、標準的なJPEGフォーマットを改良したもので、ウェブ上でプログレッシブJPEGイメージをダウンロードする場合、まずイメージが大まかな輪郭で表示され、その後、具体的な詳細が徐々に表示されるため、プログレッシブJPEGと呼ばれています。 このように、プログレッシブJPEGのスキャンしたレイヤーをHTTP2多重化経由で配信し、知覚性能と速度指標を向上させる方法はすでに2012年にGoogleのJohn Mellor 。HTTP2多重化経由でプログレッシブJPEGのスキャンレイヤを配信するSPDY 知覚性能と速度指数を向上させるこのアプローチは、2012年にGoogleのジョン・メラーによって 注目されました 。彼はHTTP2の前身であるSPDYプロトコルで実験を行っていました。

JPEG2000は新しいタイプのイメージ圧縮方式で、圧縮品質が向上し、無線伝送時の不安定な信号によるモザイクや位置ずれの問題を改善します。また、JPEGのアップグレード版として、JPEG2000の圧縮率は標準JPEGより約30%高く、非可逆圧縮と可逆圧縮の両方に対応しています。また、プログレッシブ伝送にも対応しており、まずイメージの大まかな輪郭を伝送し、その後徐々に詳細なデータを伝送することで、ぼんやりとしたイメージから鮮明なイメージへと徐々に変化させて表示することができます。さらに、JPEG2000は関心領域をサポートしており、イメージ上の関心領域の圧縮品質を指定したり、最初に伸長する部分を指定したりすることもできます。もう一つの利点は、JPEG2000は可逆圧縮から非可逆圧縮まで互換性があることです。







圧縮ステップ

JPEGの非可逆圧縮は、他のどの圧縮方法よりも優れていないので

そこで、最も一般的に使用されているベースラインJPEGアルゴリズムでの非可逆圧縮に焦点を当てます。24ビットのカラーイメージを例にとると、JPEGの圧縮ステップは次のように分けられます:

カラー変換

JPEGは、いずれかの色空間を使用するイメージをサポートし、1~4つの色成分をサポートします。RGB、YUV、YCbCrなどは3色成分、シアン、マゼンタ、イエロー、ブラックは4色成分です。彩度チャンネルに含まれる大量の冗長情報を減らすため、この例ではYCbCr色空間を使用。まずRGBからYCbCrへの色空間変換が必要です:

  • Y = 0.299000R + 0.587000G + 0.114000B

  • CB = -0.168736R - 0.331264G + 0.500002B

  • cr = 0.500000r - 0.418688g - 0.081312b

ここで、Yは輝度成分、CbとCrは青赤成分。

DCレベルオフセット

数学的な計算では、イメージ内のどのような変換や数学的な計算も、単にこれらのサンプルを2の補数表現に変換することから始まります。直流レベルシフトの目的は、入力イメージのサンプルがほぼゼロを中心としたダイナミックレンジを持つようにすることです。直流レベルシフトは、符号なし数値のみでイメージサンプルを表現します。

方法:イメージコンポーネントのサンプリング精度をnと仮定すると、コンポーネント内の各ピクセル値は2のべき乗を減算する必要があります。

CT(X線断層撮影)イメージのように、サンプルが符号なし整数で表現されるイメージの場合、ダイナミックレンジはすでにゼロを中心としているため、DCレベルオフセットは不要です。

サブサンプリング

色空間変換後、イメージの空間情報のほとんどは輝度成分Yに含まれ、クロミナンス成分CbとCrには冗長な色情報が多く含まれます。クロミナンス成分CbとCrには冗長な色情報が多く含まれているため、失われる情報量を少なくしてイメージを圧縮するために、クロミナンスのデータ量を減らすサブサンプリングが適用されます。ベースラインJPEGの一般的なサブサンプリング形式は4:2:0で、4:2:2と4:4:4の両方のカラー形式がサポートされています。

DCT変換

DCTはイメージ信号を周波数領域で変換し、高周波と低周波の情報を分離するプロセスです。次に、イメージの高周波数部分を圧縮してイメージデータを圧縮します。イメージはまず複数の8*8行列に分割されます。次に、DCT変換を各行列に適用します。変換の結果、周波数係数の行列ができ、周波数係数は浮動小数点数です。

定量的

後の符号化処理で使用されるコードブックは整数であるため、変換された周波数係数を量子化し、整数に変換する必要があります。データの量子化を行った結果、行列内のデータは近似値となり、元のイメージデータとの間に差が生じます。この差がイメージ圧縮後の歪みの主な原因となります。

この際、画質係数の選択は非常に重要です。逆に、品質係数を小さくすればするほど、イメージの再構成品質は向上しますが、圧縮率は低下します。この点に関して、ISOはJPEGコードの実装者が使用する標準的な量子化値のセットを開発しました。

右の2つの分位表のデザインは、Lohschellerが2次元基底関数の可視閾値を決定するために行った心理視覚実験に基づいています。

エンコーディング

前のプロセスからわかるように、色変換は符号化まで完了し、イメージはそれ以上圧縮されないので、DCT変換と量子化は符号化段階の準備といえます。

エンコードには2つのメカニズムが使われます。1つ目は0値のトリップ長エンコード、2つ目はエントロピーエンコードです。

曲がりくねる

つまり、行列の対角線に垂直なジグザグ方向に行列の要素を配置します。この利点は、より大きな値を持つ行列の左上隅付近の要素がストロークの前に配置され、ストロークの後ろに配置された行列要素は実質的にゼロ値であることです。

RLEによるAC係数の符号化

  • ここでは繰り返しません。

    AC 係数のジグザグシーケンス符号化には、2 つの特別な記号 - と - があることに注意することが重要です。最初の特殊記号はブロックの終わりを意味し、ジグザグブロックの残りの要素がすべてゼロであることを示すために使用されます。もう1つの特殊記号はゼロトラベルの長さを表し、16回のゼロトラベルを示すために使用されます。ベースラインJPEGで許されるゼロトラベルの最大長は16です。ここに16個以上のゼロがある場合、ツアーは長さ16のいくつかのゼロツアーに分かれます。

  • DCT係数の定量化の後、定量化されたDC係数は差分符号化によって符号化されます。現在のブロックのDC係数は前のブロックのDC係数から減算され、その差は右図のように符号化されます。これは隣接するブロックのDC値間の空間的相関を利用するものです。

  • 符号化は、実際には統計的性質に基づく符号化方法です。JPEGではHUFFMAN符号化または算術符号化が認められています。そして、ベースラインのJPEGアルゴリズムは前者を使用しています。

    RLEで符号化されたAC係数は、前者はホフマン符号化、後者はVLI符号化を用いて、2つの符号和にマッピングすることができます。同様に、DPCMで符号化されたDC係数は、前者はホフマン符号化、後者はVLI符号化を用いて、2つの符号和にマッピングすることができます。

    ベースラインJPEGでは、AC係数符号化に2つ、DC係数符号化に2つ、合計4つのホフマンテーブルを使用することができました。





JEPGファイルの認識方法



最初の3バイトが何であるかを判断するのは実はとても簡単で、FF D8 FFで始まることがわかれば、それはJEPGイメージとみなされます。

JPGファイルはデータのセグメントで構成されており、セグメントの数や長さは決まっていません。十分な情報が含まれていれば、JPEGファイルを開くことができます。

JPEGフォーマットとラベリング

JPEGイメージフォーマット構成要素:SOI+APP0+ DQT+ SOF0+ DHT + DRI+ SOS+ EOI

JPGファイルを16進数モードで開くと

フラグ0xFFE0~0xFFEFは "アプリケーションマーカー "と呼ばれ、JPEGファイルのデコードには必要なく、設定情報などを格納するために使用できます。EXIFもこのフラグセグメントを使用して情報を挿入します。具体的には、APP1(0xFFE1)マーカーです。

------------------
名称 タグコード
------------------
SOI D8  
EOI D9  
SOF0 C0  
SOF1 C1  
DHT C4 定義ハフマンテーブル
SOS DA スキャンライン開始
DQT DB 量子化テーブルの定義
DRI DD リスタート間隔を定義する
APP0 E0 交換フォーマットとイメージ認識情報を定義する
DNL DC  
COM FE  

セグメントタイプは30種類ありますが、すべてのプログラムで認識しなければならないのは10種類だけで、他は無視してもかまいません。

JPEG形式とマーカー

SOI MarkerMarker XX size=SSSSMarker YY size=TTTTSOS Marker size=UUUUImage streamEOI Marker

0xFFE0~0xFFEFのフラグは "アプリケーションフラグ "と呼ばれ、JPEGイメージデコード時に存在する必要はありません。 これらはユーザのアプリケーションで使用されます。 例えば、古いオリンパス/キヤノン/カシオ/アグファのデジタルカメラは、イメージを保存するためにJFIF(JPEG File Interchange Format)を使用します。 JFIFはAPP0(0xFFE0)フラグを使ってデジタルカメラの設定データとサムネイルを挿入します。

Exifもアプリケーションフラグを使用してデータを挿入しますが、ExifはJFIFフォーマットとの競合を避けるためにAPP1(0xFFE1)フラグを使用します。 そして、すべてのExifファイルフォーマットは、次のように、このフラグで始まります。

FFD8SSSSTTTTSOS Marker size=UUUUFFYYTTTT

Exifもアプリケーションフラグを使用してデータを挿入しますが、ExifはJFIFフォーマットとの競合を避けるためにAPP1(0xFFE1)フラグを使用します。 そして、すべてのExifファイルフォーマットはこれで始まります。

Exifで使用されるマーカー

イメージファイルは SOI (0xFFD8) タグで始まり、JPEG ファイルです。 その直後に APP1 タグが続きます。 すべての Exif データは APP1 データフィールドに格納されます。 上の "SSSS "の部分はAPP1データフィールドのサイズを示しています。 SSSS "のサイズには、記述子自体のサイズも含まれることに注意してください。

SSSS "の後に APP1 のデータがあります。 最初の部分はExifかどうかを識別する特殊なデータで、その値はASCII文字 "Exif "と2つの0x00バイトの組み合わせです。

APP1タグフィールドの後に、他のJPEGタグが続きます。

exifデータ解析

イメージデータが16進数の場合、以下のようになります:

ff d8 ff e0 00 10 4a 46 49 46 00 01 02 01 00 60 00 60 00 00 ff e1 08 32 45 78 69 66 00 49 49 10 60 00 60 20 00 ...... ffd9

そして、FF D8 が SOI フラグビット、FF E0 が exif ファイルのスタートビット、次の 4 ビットが exif マーカ情報の長さです。この長さのデータをTIFFdataデータとしてパースし、文字列として直接exifをパースしても問題はないようです。

D8

FF E0

FF E1

......

イメージストリーム

FFD9

各セグメントはFFxxで始まり、xxはセグメントの識別、その後に続くのは2ビットの終了長。続くのはデータです。最初のメタデータが読み出された後、続くバイナリデータがイメージデータです。

データサイズ記述子は "Motorola "のバイトオーダーで、データの下位ビットは上位アドレス、つまりBigEndianに格納されます。 上の "data content "は、下のものがフラグであれば、その前にあるデータサイズ記述子を含むことに注意してください。

この長さは上位ビットが最初で下位ビットが2番目で表現され、インテルの表現とは異なります。例えばセグメントの長さが0x12ABだとすると、0x12、0xABの順番で格納されます。しかし、Intelの方法に従えば、ハイビットが後ろ、ロービットが前になり、0xAB, 0x12のように格納され、この格納方法はJPEGでは正しくありません。この場合、プログラムがJPEGファイルのセグメントを認識しない場合、最後の2バイトを読んでセグメントの長さを取得し、それを無視してスキップすることができます。

exif情報のデコードについては、「JPEG/Exif/TIFF形式の解釈:イメージメタデータの保存とEXIFの詳細説明」をお読みください。

jpeg10で必要なセグメントタイプ

10種類のセグメントをご紹介します。

APP0 イメージ認識情報

-------------------------------------------------
名称 バイト数 値 説明
-------------------------------------------------
  1 FF
  1 E0
セグメント長 RGBサムネイルがある場合は、2 0010 = 16 + セグメント長 RGBサムネイルがある場合は、2 0010 = 16 + セグメント長3n
 
交換フォーマット 5 4A "JFIF" ASCIIコード
マスターバージョン番号 1
サブバージョン番号 1 
密度単位 1 0 = 単位なし; 1 = ポイント/インチ;2=ポイント/ 
Xピクセル密度 2 水平密度 
Y画素密度 2 垂直密度
サムネイルXピクセル 1 サムネイルの水平ピクセル数 
サムネイルY画素数 1 サムネイル垂直画素数
RGB  3×n n= サムネイルの総画素数=サムネイルX画素数×サムネイル Y ピクセル

説明

  • RGBのサムネイルがある場合、= 16 + 3n」とはどういう意味ですか?例えば、"サムネイルXピクセル "と "サムネイルYピクセル "の値が48の場合、48×48ピクセルのサムネイルがあることを意味します。サムネイルは24ビットのトゥルーカラービットマップで、1ピクセルを表すのに3バイト、つまり合計3nバイトです。しかし、ほとんどのJPGファイルは、この "チキン "サムネイルを持っていません。

DQT定義定量表

--------------------------------------------------------------------------
名称 バイト数 値 説明
--------------------------------------------------------------------------
  1 FF
  1 DB
セグメントの長さ 2 43 その値 = 3n
QT情報 1 0-3ビット:QT番号
4-7ビット:QT精度
QT n n 64×QT精度のバイト数

説明

  • JPEGファイルには通常2つのDQTセグメントがあり、1つはY値用、もう1つはC値用です。

  • DQTセグメントには複数のQTを含めることができ、それぞれが独自の情報バイトを持ちます。













イメージファイルの回転について JPEGとEXIF情報

www.media.mit.edu/pia/Researc...

JPGイメージのExif属性を読む - Exif情報入門

JPGイメージのExif属性を読み込む - Exif属性からGPS情報コードを読み込む

jpgイメージにExif情報を付加するCプログラムの実装

JPEGイメージフォーマットの詳細

圧縮アルゴリズム - JPEG2000コーデックの原理





記事「JPEG/Exif/TIFFフォーマット解釈:JEPGイメージ圧縮と保存原理解析」を転載します、

出典を明記してください:



Read next

いつもhttpステータスコードを要求するのか?これをブックマークしておけば十分だ!

201 Created これは通常、POSTリクエスト、またはいくつかのPUTリクエストの後に返される応答です。 202 Accepted リクエストは受信されましたが、応答されませんでした。

Jan 14, 2021 · 2 min read