PNG・JPEG・BMP・TIFF・WebP など

# これは何？

PNG・JPEG・BMP・TIFF・WebP などの特徴を雑に正しくまとめた記事が見当たらなかったので書いた。

ユーザー目線。

TIFF の タグ構造の不便さとか、BMP のピクセルはなぜか下から順が多いのでめんどくさいよとか、そういう話はしない。

# 画像フォーマットのめんどくさいところ

画像フォーマットの話をするときに、仕様の話をすること自体も難しいし、仕様の話をするだけでは済まないところも難しい。

## 画像って何？

はるか昔は色番号を画素数分並べたもの、みたいな気持ちだったと思う。そのままだと持ち運びに不便だから、画像特有の性質を使って圧縮したりする感じ。

でも今は。

カラープロファイルが入っていて、ディスプレイの色空間に合わせて調整してほしそうだったり。
DPI 情報があって、印刷したらどんな大きさになるかが指定されていたり。
ということで見え方をバイト列にしたものという側面もある。

画像を合成するための素材という側面としては、ディスプレイに出しても絶対に差が出せないような僅かな輝度の差が表現できたりすることもある。

## 普通それは使わない、ってやつ

めんどくさいのは「フォーマットの仕様としては xx があるけど、それをサポートしているソフトウェアは殆どない」というパターン。

たとえば BMP の中に JPEG を入れることができるんだけど、たぶんそういう形式をサポートしているエンコーダはあまりないと思う。なので「BMP は可逆圧縮だよ」は間違っているとも言えるけど、扱うエンコーダ・デコーダ の事も考えると正しいとも言える。

## それはフォーマットじゃなくてコンテナ

HEIF とか、さっきの BMP もだけど、圧縮方式とフォーマットは別、ということがある。
言葉遣いが難しくなる。

この文書は雑に行きたいので、コンテナと中身をあまり区別しないで書こうと思っている。

# 各種フォーマットの特徴

## GIF

透過情報を持つことができる唯一のメジャーなフォーマットとして君臨していたが、その役割は今は PNG が担っている。

動画ファイルってほどでもないけど一応アニメーションを持つことができる形式として君臨していたけど、たぶん WebP にその座を譲りつつある。

現在の視点から見ると、フルカラーをサポートしていないという点で珍しい。

[Wikipedia](https://ja.wikipedia.org/wiki/Graphics_Interchange_Format) によると

> なお、ほとんど用いられることはないが、非可逆圧縮もサポートしている。

とのこと。知らなかった（本当かどうかを確認していない）。

|項目|情報|
|:--|:--|
|最大サイズ|65535×65535|
|最大色数|約1600万色中 256色|
|透過|できるけど「ちょっと透ける」は無理だと思う|
|色空間|RGB(?) のみだと思う|

## BMP

Windows がサポートする代表的な画像フォーマットとして君臨していたが、わりとめんどくさいやつ。
拡張子は稀に `.dib`  のこともある。

たぶん、[Microsoft の BITMAPV5HEADER の記事](https://learn.microsoft.com/ja-jp/windows/win32/api/wingdi/ns-wingdi-bitmapv5header) を見ると、できることが全部書いてある。

みるとわかるけど、PNG や JPEG を埋めたり、アルファチャンネルを持ったり、色空間情報を持ったり、RLE という古典的な圧縮をサポートしていたりする。

しかし、BMP 形式のファイルを作成するソフトウェアで、JPEG 形式で埋め込むという選択肢を出している GUI を見たことがないと思う。そういう BMP を作ったことがないので、読む側がどうなのかはもっとわからない。

|項目|情報|
|:--|:--|
|最大サイズ|21億×21億 ？|
|最大色数|約1600万色 といいたいところだけど、PNGが埋まっているともっと行けるんだろう|
|透過|できるけど、ソフト側はどうしているだろうか|
|色空間|色々できるけど、ソフト側は無視しがちと思う|

## TIFF

たぶん [TIFF™ Revision 6.0](https://developer.adobe.com/content/dam/udp/en/open/standards/tiff/TIFF6.pdf) に全部書いてある。

そして上記の文書を見ると分かる通り、仕様が膨大。
なので、きちんと「TIFF対応です」と言うのはむずかしい。
ある TIFF は OK でも、別の TIFF では色がおかしくなり、また別の TIFF では全く開けない、のようなことが起こりがち。

画像サイズは 32bit 符号なしなので 1辺 42億ぐらい。
モノクロ 1bit から、CMYKアルファ各256bit までサポート。
どうも浮動小数点数カラーまでサポートしているらしい。

エンコーダ・デコーダがサポートているかどうかは別だけど。

Adobe さんが管理しているということもあり、ソフトウェアの色空間サポートはちゃんとしていることが多そう。

「タグ」というもので好きな情報を埋め放題ということで、デジカメの撮影情報や位置情報を埋めることもできる。

|項目|情報|
|:--|:--|
|最大サイズ|42億×42億|
|最大色数|無量大数の4乗 ぐらいかな|
|透過|できるけど、ソフト側はどうしているだろうか|
|色空間|色々できるし、サポートされていることが多そう|

## PNG

PNG is Not Gif の略だと教わった。

GIF が担っていた「透過情報付きの写真っぽくない画像の可逆圧縮」をリプレースするために現れたんだと思っている（思っているだけ、未調査）。

アニメーションGIFもリプレースしようとしていて、 APNG として仕様もあるけど、こちらはうまく行ってないと思う。どうだろう。

可逆圧縮なので、中間生成物のファイルとして有用で、デザイナに渡す画像はとりあえず PNG にしていた。
ちゃんとしたアルファチャンネルが使える唯一のメジャーな（私見）フォーマットとして君臨していたが、今は他にもある感じ。

GIF を意識していたからだと思うんだけど、パレット形式（1677万色中16色とか）を細かくサポートしている。
私としては 16bit channel があるのが嬉しいと思ってるんだけど、16bit channel の PNG が読めないソフトもわりとある。

これも GIF を意識していたからだとおもうんだけど、基本的に画面に出すことにフォーカスしていて RGB 以外の色空間のサポートがないし、RGB でも本当は sRGB とかいろいろあるはずなんだけど、そういうものにも対応していない。それなのになぜか gamma だけは変えられる（とはいえ、gamma をちゃんと見ないソフトも多い印象）

圧縮の前処理がたくさんあって、どれがお得なのかはやらないとわからない。なので、最高圧縮率を実現するには多くのパターンを試す必要があって、そうすると圧縮が遅い。
そんなに頑張らなければ決して遅くはない。

|項目|情報|
|:--|:--|
|最大サイズ|42億×42億|
|最大色数|280兆色|
|透過|できるし、多くのソフトで対応|
|色空間|ほぼ非サポート|

## JPEG

JPEG は組織名。G は Graphics ではなく Group。
フォーマットの名前は JPEG File Interchange Format なので、拡張子は .jfif のことがある。
拡張子は「拡張子は 3文字まで」という OS が広まっていた時代だったからか .jpg が多いと思うけど、その軛から逃れた現在は .jpeg のことも多い。稀に .jpe のこともある。

それはさておき「元には戻せないかわりにすごく圧縮されるよ」を武器とした、最初のメジャーな（私見）フォーマット。

仕様は [JPEG File Interchange Format Version 1.02](https://www.w3.org/Graphics/JPEG/jfif3.pdf) かな。

すごく圧縮されるフォーマットとしては当時唯一のメジャー（私見）フォーマットだったので、ほとんどのデジカメで採用された。そうすると撮影情報を埋めたくなるわけだけど、すでに TIFF は撮影情報の仕様があり、一部のデジカメは TIFF にも対応していたということもあり、JPEG 内 TIFF ヘッダがあり、そこからは TIFF 形式にして撮影情報を埋めるというやや思いがけない仕様になっている。

「算術圧縮」という方式を使うと可逆圧縮できるという記載を見ることがあるが、そういう JPEG ファイルを見たことはない。

|項目|情報|
|:--|:--|
|最大サイズ|42億×42億|
|最大色数|1677万色|
|透過|できるけど、ソフト側はどうしているだろうか|
|色空間|色々できるし、サポートされていることが多そう|

## JPEG関連

JPEG（というグループ）は、JPEG（という画像形式）のあと、

* JPEG 2000
* JPEG-LS
* Lossless JPEG
* JPEG XR

という４つの規格を作っている（と思う）。

JPEG 2000 はほんの少し試したことがあるけど、ほかは全く見たことがない。
見たことがないんだけど、何かの機器が作るファイルが JPEG XR だったり、何かの装置がつくるファイルの中に JPEG-LS が埋まっていたりすることがあるんだと思う。

私としては、調べたいと思うほどのメジャーな形式じゃないという印象。どうなんだろ。

## カメラRAW

デジカメが保存する画像が JPEG だともったいないということで、デジカメ各社が JPEG にする前の情報を保存するために作った形式。

各社勝手にやっているので、「普通こうだよ」とか言うことは出来ない。
サムネイルも、あったりなかったり。
撮像素子の情報をそのまま書いているんだと思う。

RAW ファイルは、画像というよりも、撮影の際に得られた情報をそのまま記録したもので、現像処理によってはじめて画像になる感じ。

## DNG

カメラRAW が各社ばらばらで不便だよ、ということで、 Adobe さんが作ったのが DNG。
一部のカメラは現像前の情報を DNG として保存することができるし、そうでないカメラの RAW も DNG に変換（そうしたければ、変換前の RAW を内蔵した状態に変換）することができる。

仕様は
[Digital Negative (DNG) Specification Version 1.7.0.0](https://helpx.adobe.com/content/dam/help/en/photoshop/pdf/DNG_Spec_1_7_0_0.pdf)
にある。
真面目に読んでないけど、その正体は特殊な TIFF っぽい。

## WebP

Google 様がつくった、ブラウザの静止画は全部これで行け、という気持ちを感じる（個人の印象です）画像形式。

仕様は [ウェブ用の画像形式](https://developers.google.com/speed/webp) かな。

WebP はコンテナで、中身は VP8L（可逆）または VP8（非可逆）のいずれの可能性もある。
いずれでも透過情報をもつことができる。

JPEG・PNG よりもあとに作っているので、同じ画像を圧縮しても WebP のほうがファイルサイズが小さくなる。

現代のブラウザはみんな対応しているので、ブラウザに表示するアイコンや写真を JPEG/PNG にする理由はたぶんもう無い。全部 WebP にすればよい。

カラープロファイルはちゃんとサポートされている。

Exif 情報も入れられるけど、カメラが WebP を出したいと思うことは少ないんじゃないかな。

弱点は３つかな。

なぜか、画像の幅高さの上限が 16384 なので、それを超える巨大画像は作れない。まあそんな画像が必要になることは稀と思うけれど。

あと、16bit/channel とかにできない。こちらは最終成果物として困ることはまったくないと思う。

CMYK に非対応なのも用途によっては困る。CMYK 非対応というのはそういう用途のフォーマットじゃないんだよ、というメッセージなんだと思う。

|項目|情報|
|:--|:--|
|最大サイズ|16384×16384|
|最大色数|1677万色|
|透過|万全|
|色空間|仕様にあるけど、各種ソフトがどうしているのかは全然知らない|

## HEIF

iOS で写真取ったら JPEG にならずに HEIF になっていてびっくりした、という出会い方をしている人が多いんじゃないかと思う。私もその一人。

というわけで、この記事のために調べたんだけど、これを読めばいい、みたいなのは 20分ぐらいでは見つからなかった。惜しいのは [HEIF Technical Information - High Efficiency Image File Format](https://nokiatech.github.io/heif/technical.html)。

デジカメ用ということで出会っているので、撮影情報は当然持てる。
可逆も不可逆も行ける。
8bit / sample と 16bit / sample は行ける。8以下は不明。16以上は無理そう。

ということでよくわからなかった。

|項目|情報|
|:--|:--|
|最大サイズ|不明|
|最大色数|280兆色|
|透過|不明|
|色空間|対応と思う|

# まとめ

適当に表にした。
「透過」は、マスクを使った透過。完全に透明 / 完全に不透明 の二値ができるという意味。
「ちょっと透ける」はアルファチャネルを使った透過。やや不透明 / うっすら見える のようなことができるという意味。

✅ は「対応」
❌ は「非対応」
❗ は「仕様上は対応している・対応していそうだけどあんまり使われてない感じ（私見）」
❣ は「仕様上は対応しているけど、実装されているのが普通なのかどうかわからない（私見）」
❓ は「よくわからないけど対応してなさそう」

|項目|GIF|BMP|TIFF|PNG|JPG|WebP|HEIF|
|:--|:--|:--|:--|:--|:--|:--|:--|
|最大1辺|6万|21億?|42億|42億|6万|1万6千|不明|
|最小 bit/pix|1|1|1|1|8?|1|8?|
|最大 bit/pix|8|32|256×5?|16×4|8×3?|8×4|16×3?|
|透過|✅|❗|❗|✅|❌|✅|不明|
|ちょっと透ける|❌|❗|❗|✅|❌|✅|不明|
|可逆圧縮|✅|✅|✅|✅|❗|✅|✅|
|不可逆圧縮|❗|❗|❗|❌|✅|✅|✅|
|アニメ|✅|❌|❓|❌|❌|❣|❓|
|色空間|❓|❗|✅|✅|✅|✅|✅|
|CMYK|❓|❓|✅|❌|✅|❓|不明|
|撮影情報|❌|❓|✅|❓|✅|✅|✅|
|ブラウザ対応|**良**|謎|悪|**良**|**良**|**良**|謎|

こうしてみると分かる通り、WebP が強い。
最終成果物で、CMYK がどうでもいい場合は WebP にしておくのが正解という気持ち。
中間生成物の場合、PNG が便利そうだけど、こちらも CMYK が無い。
CMYK なら、アプリケーション専用フォーマットでなければ TIFF なのかなぁ。HEIF はどうなんだろう。

# 最後に

HEIF の詳しい情報が載っている、信頼できそうなページがあったら教えて下さい。