2008-09-09 25 views
11

ファイル全体をメモリに読み込まなくても、画像のフォーマットを確認する良い方法はありますか?ファイル全体を読み取らずに、ファイルのイメージ形式を推測する方法はありますか?

明らかにこれはフォーマットによって異なります(私は特にTIFFファイルに興味があります)が、ファイル全体を読み取らずにファイルの画像形式を決定するのにどのような手順が有用でしょうか?

BONUS:画像がBase64でエンコードされた文字列の場合はどうなりますか?それをデコードする前にそれを推論する信頼できる方法はありますか?

答えて

17

ほとんどのイメージファイル形式は、最初は一意のバイト数を持っています。 unix fileコマンドは、ファイルの開始点を調べて、ファイルに含まれているデータの種類を確認します。 Magic numbers in filesmagicdb.orgに関するウィキペディアの記事を参照してください。

+2

最後にマジックナンバーを持つTargaと、TIFFと完全に区別できないRAWのいくつかのフレーバー(ただしその逆)は例外です。 – plinth

0

* nixコマンドラインでfileのいずれか、またはファイルの最初のバイトを読み取る。ほとんどのファイルには最初の数バイトに一意のヘッダーが付いています。たとえば、TIFFのヘッダーは次のようになります。

0x00000000: 4949 2a00 0800 0000
TIFFファイル形式の詳細については、これらのバイトの意味を知りたい場合は hereを参照してください。 TIFFファイルは、IIまたはMM(インテルのバイト順序またはMotorolla)のいずれかで始まります

http://www.wotsit.org

+2

Yikes「何かのようなもの」は危険です。有効なtiffヘッダーは49 49 2a 00または4d 4d 00 2aです。 49 49フォーマットでは、ほとんどのファイルでIntelバイトオーダリング(リトルエンディアン)が使用され、4d 4dではMotorolaバイト(ビッグエンディアン)が使用されます。つまり、2aと00はIntelから逆転されます。 – plinth

0

ファイル形式の総合的なサイトはで入手できます。
TIFF 6仕様はhereをダウンロードすることができ、あまりにも難しいことではありません。

4

があります。他の人が触れたように、ほとんどの画像はある種の「Magic」から始まります。このMagicはいつも何らかのBase64データに変換されます。以下は、カップルの例である:

Aビットマップは Qk3

A JPEG形式で開始する

/9j/

A GIFは(すなわち、第2チャーとしてゼロ'S)R0lで開始すると開始されます。

など。さまざまな種類の画像を取り込み、エンコードする内容を理解することは難しいことではありません。いくつかの魔法が1つ以上あるので、B64の「翻訳コード」で説明する必要がありますので、注意してください。

関連する問題