最近画像を動的に扱うような事をしていて良く「この画像の形式なんだっけ?」となるので自分用にメモしておく。イロイロあって拡張子と中身のデータが合わない事良くあるので...。
基本的に Linux 上で作業しているので、バイナリで表示する od コマンドを使います。たまに Windows でやるときは Stirlin なんかを使ってます。
od の使用方法
引数何も付けずに実行しても何か表示されるけどこれは僕では読めない...。
$ od test.jpg
0000000 154377 160377 010000 043112 043111 000400 000401 060000
0000020 060000 000000 160777 126000 074105 063151 000000 046515
(省略)
ので引数をいくつかつける。
-t オプションで表記を指定する事ができる。
これに x をつけると 16進数表記, さらに続けて 1 で1バイト単位で16進数表記。
-c で文字として表記する。
これをまとめると以下のようなコマンドになる。ついでに出力がながいので head で先頭行だけ表示するようにした。
$ od -tx1c test.jpg | head -n 2
0000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
377 330 377 340 \0 020 J F I F \0 001 001 001 \0 `
とここまで書いてなんだけど、文字で表示できるなら16進数を表記する必要が無いです。引数は -c だけで ok だ。
画像種類別の先頭バイトの文字列
JPEG
$ od -c test.jpg | head -n 1
0000000 377 330 377 340 \0 020 J F I F \0 001 001 001 \0 `
PNG
$ od -c test.png | head -n 1
0000000 211 P N G \r \n 032 \n \0 \0 \0 \r I H D R
GIF
$ od -c test.gif | head -n 1
0000000 G I F 8 9 a d \0 d \0 367 \0 \0 \b \a 004
BMP
$ od -c test.bmp | head -n 1
0000000 B M F + \0 \0 \0 \0 \0 \0 6 004 \0 \0 ( \0
見ての通り、先頭バイトを文字列としてちゃんと読めばどの画像ファイルなのかすぐわかる。簡単デスネ。
しかしこのような状況にならないに越したことはない...。