dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

画像形式の判定方法

2021-02-06 13:15:10 | linux
画像形式をデータから判定する方法のメモ。

画像ファイルの形式は、画像データの先頭のバイト列のマジックナンバーをチェックすることで判定することができます。
画像 URL の拡張子と画像データの形式が一致しない場合でも、画像データの先頭をチェックすることで、画像形式の判定を行うことができます。

jpg: 先頭が 0xff 0xd8
png: 先頭が 0x89 0x50(P) 0x43(N) 0x47(G)
gif: 先頭が 0x47(G) 0x49(I) 0x46(F)

ちなみに、gzip の場合は先頭が 0x1f 0x8b となります。

例えば、perl の場合には以下のようにして判定を行うことができます。
   if ($obj =~ /^\xff\xd8/) {
        print("jpg\n");
    }
    elsif ($obj =~ /^\x89\x50\x43\x47/) {
        print("png\n");
    }
    elsif ($obj =~ /^\x47\x49\x46/) {
        print("gif\n");
    }
    elsif ($obj =~ /^\x1f\x8b/) {
        print("gzip\n");
    }
    else {
        print("other\n");
    }