JPEG 画像ファイルはメタデータとして解像度(Resolution もしくは Density)値を DPI単位もしくはcm単位で保持できます。そのうんちくです。
JPEG 解像度について
スキャナで映像を取り込んだ時やスクリーンショットで JPEG 保存した時など、
対象の物理的大きさを元に算出した DPI 値を JPEG ファイルに含める事が多いです。
スキャナだと 200 や 300、スクリーンショットは 72 や 144 が代表的な値です。
ベクター画像から JPEG に変換する場合だと 37 をよく見かけます。
とりあえず JPEG のメタデータを見るツールを作ってみました。JPEGファイルをドロップしてお試し下さい。
JavaScript でローカルに動くので、サーバにアップロードしません。
JFIF 規格
JPEG の歴史的に解像度はまず JFIF marker に実装されました。
JPEG チャンクでいう APP0 です。
units | (1 byte) | Units for the X and Y densities. units = 0: no units, X and Y specify the pixel aspect ratio units = 1: X and Y are dots per inch units = 2: X and Y are dots per cm |
Xdensity | (2 bytes) | Horizontal pixel density |
Ydensity | (2 bytes) | Vertical pixel density |
見ての通り、横方向の解像度と縦方向の解像度を別で表現します。
units によって Xdensity, Ydensity の意味合いや単位が変わります。
units: 0 (aspect ratio)
units:0 の場合は、ピクセル(またはドット)の縦横比 aspect ratio を表す値になります。
つまり解像度(Resolution/Density)ではありません。無単位です。
具体的にはピクセルの物理的サイズが正方形の時は 1:1 が入ります。
The JFIF APP0 marker provides information which is missing from
the JPEG stream: version number, X and Y pixel density
(dots per inch or dots per cm), pixel aspect ratio
(derived from X and Y pixel density), thumbnail.
PCモニタは正方形ですが、昔のご家庭テレビや映画フィルム等は少し長方形で、これらに対応する規格のようです。
units: 1 (dots per inch, DPI)
units: 1 だと 72:72 や 200:200 といったおなじみの DPI 値を入れる事ができます。
units: 2 (dots per cm)
こちらは cm 単位です。おなじみ国際単位系 (SI) ですね。
ヤードポンド系死すべしって時に使います。
units の実情
実際には units:0 のまま DPI を入れる処理系もあったりで混乱させられます。
DPI の値は x:y の比率でもあるので一応仕様通りで、約分が面倒でそのまま入れてるのかもしれません。
具体的にいうと macOS スクリーンショットですが、これは Exif にも DPI 値を残してるので。そちらを見れば良いです。
Exif 規格
上記のように JFIF に DPI 解像度を入れない事があり。DPI が大事な時は JPEG に Exif をつけて解像度を含める事が多いです。
JPEG チャンクの APP1 です。
タグ名称 | Field Name | タグ番号Dec | Hex | タイプ | カウント |
---|---|---|---|---|---|
画像の幅の解像度 | XResolution | 282 | 11A | RATIONAL | 1 |
画像の高さの解像度 | YResolution | 283 | 11B | RATIONAL | 1 |
ただ、Exif は JPEG ファイルサイズ削減で消される筆頭なので、
- JFIF に aspect ratio でなく DPI で入れる
- Exif の全部を消さず resolution だけ残す
- Exif を strip する時に JFIF に反映してくれる神プログラムを探す。☜ ImageMagickとか!!
- DPI を諦める、(Web 表示用なら DPI あまり関係ないですし)
といった判断に迫られるでしょう。
72 DPI
Exif の規格書には以下のように書かれています。
ImageWidth 方向の 1 ResolutionUnit あたりの画素数。画像の解像度が不明のときには
72[dpi] を記録しなければならない。
画像の幅と高さの解像度の単位
ResolutionUnit XResolution と YResolution の単位系。
XResolution、YResolution と一緒に用いる。
画像の解像度が不明のときには 2(インチ)を記録しなければならない。
つまりインチ単位で 72 が入っている時は文字通りの 72DPI とは限らないようです。
特殊な値として覚えておくと良いかもしれません。
そもそも論
そもそも JPEG の resolution DPI値は実用上、あまり意味がないので気にしない。というのも手です。
JPEG ファイルを PDF に包まず単体でプリンタに送ってしまうとか、macOS 標準プレビューで開く時に、DPI によって表示サイズが違う。みたいな影響はありますが、それらにこだわる状況はあまりないでしょう。
でもって、こだわる時は処理フロー全体で真面目に拘りましょう。頑張って。٩( 'ω' )و