【php】マジックナンバーを見て画像の種類を判定する
問題
ファイルの内容の種類を、マジックナンバーをを見て判定したい。
(フォーマット識別子、マジックバイト)
答え
自作するとこんな感じ。
<?php function gazoHantei($filename) { //先頭数文字を取得する.巨大なファイルでも先頭だけ見る. $magic = file_get_contents($filename, false, null, 0, 12); $type = ''; if (strpos($magic, 'GIF') === 0) { //GIF87a,GIF89a $type = 'GIF'; } else if (strpos($magic, "\x89" . 'PNG') === 0) { $type = 'PNG'; } else if (strpos($magic, "\xFF\xD8") === 0) { //FF D8 DD E0 or FF D8 FF EE $type = 'JPG'; } else if (strpos($magic, "BM") === 0) { $type = 'BMP'; } else if (strpos($magic, "\x25\x21") === 0) { $type = 'EPS'; } else if (strpos($magic, "%PDF-1") === 0) { //%PDF-1.3, %PDF-1.4 ... $type = 'PDF'; } return $type; } echo gazoHantei('logo.png'); // → PNG
ただ、画像ファイルでこれをやりたいなら、phpの関数の getimagesize() を使えばよい。同じようなことをやっている。
PDFやFlash、AI、PSD、EPS、Officeファイル、音声ファイル、動画ファイルなどを判定したいときに自作するとよい。
本当に内容としても画像なのかも併せて確認するには、imagecreatefromstring() で画像リソースが作成できるかどうかも見るとよい。
if (imagecreatefromstring(file_get_contents($filename)) === false) { //正しい画像じゃない! } else { //画像として処理できそう(PEG, PNG, GIF, BMP, WBMP, GD2) }
メモ
多くの種類のファイルがマジックナンバーを持っているが、マジックナンバーを持たないファイルの種類もあるので、100%信頼できる仕組みではない。
拡張子 | Binary(0x16) | ASCII | UTF-8 | Shift-jis |
---|---|---|---|---|
png | 89 50 4E 47 | 臼NG | .PNG | 臼NG |
jpeg | FF D8 DD E0 | …. | … | .リ. |
jpg | FF D8 FF EE | …. | …. | .リ. |
25 50 44 46 2D 31 2E 33 | %PDF-1.3 | %PDF-1.3 | %PDF-1.3 | |
25 50 44 46 2D 31 2E 34 | %PDF-1.4 | %PDF-1.4 | %PDF-1.4 | |
GIF(89a) | 47 49 46 38 39 61 | GIF89a | GIF89a | GIF89a |
GIF(87a) | 47 49 46 38 37 61 | GIF87a | GIF87a | GIF87a |
BMP | 42 4D | BM | 8B | BM |
PSD | 38 42 50 53 | 8BPS | 8BPS | 8BPS |
PGF | 50 47 46 | PGF | PGF | |
EPS | 25 21 | %! | %! | %! |
TIFF | 00 2A | MM.* | MM.* | MM.* |
ICO(アイコン) | 00 00 01 | …. | …. | …. |
ICO(カーソル) | 00 00 02 | …. | …. | …. |
拡張子 | Binary(0x16) | ASCII | UTF-8 | SHIFT-JIS |
---|---|---|---|---|
mp3 | FF F3 40 C0 | ID3 | ID3 | ID3 |
wave | 52 49 46 46 xx xx xx xx 57 41 56 45 | RIFF….WAVE | RIFF….WAVE | RIFF….WAVE |
wmv | 30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C | 0&.u.f…….b.l | 0&.u.f…….b.l | 0&イu伺マ.ヲル.ェ.bホl |
mov | 00 00 00 14 66 74 79 70 71 74 20 20 00 00 00 00 71 74 20 20 00 00 00 08 77 69 64 65 | ….ftypqt_….qt_….wide | ….ftypqt_….qt_….wide | ….ftypqt_….qt_….wide |
avi | 52 49 46 46 | RIFF | RIFF | RIFF |
mp4 | 00 00 00 20 66 74 79 70 69 73 6F 6D 00 00 02 00 | …_ftypisom…. | …_ftypisom…. | …_ftypisom…. |
mkv | 1A 45 DF A3 01 00 00 00 00 00 00 23 42 86 81 01 | .E………#B… | .E………#B… | .E゚」…….#B・. |
3gp | 00 00 00 18 66 74 79 70 33 67 70 36 00 00 01 00 | ….ftyp3gp6…. | ….ftyp3gp6…. | ….ftyp3gp6…. |
asf | 30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C | 0&.u.f…….b.l | 0&.u.f…….b.l | 0&イu伺マ.ヲル.ェ.bホl |
拡張子 | Binary(16進) | ASCII | UTF-8 | SHIFT-JIS |
---|---|---|---|---|
exe | 4D 5A | MZ | MZ | MZ |
elf | 7F 45 4C 46 | .ELF | .ELF | .ELF |
コメント