SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【php】マジックナンバーを見て画像の種類を判定する

問題

ファイルの内容の種類を、マジックナンバーをを見て判定したい。

(フォーマット識別子、マジックバイト)

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 …. …. .リ.
pdf 25 50 44 46 2D 31 2E 33 %PDF-1.3 %PDF-1.3 %PDF-1.3
pdf 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

関連するメモ

コメント