2012-02-28 10 views
0

私はサムネイルスクリプトを書いています。サムネイルを見たことから、そのソースと同じ形式で最もよく見える傾向があります。しかし、スクリプトはウェブから画像を取得している可能性がありますので、ファイルに2回アクセスすることはできません。 exif_imagetype以外のファイルタイプやイメージを再オープンする必要のあるその他の関数を取得する方法はありますか?明らかに間違っている可能性があるので、私は拡張に頼りたくはありません。GDハンドルからイメージのタイプを判別する方法はありますか?

GDでサムネイル処理を行っていますので、ハンドルを使用するものは完璧ですが、ファイルのコンテンツも使用できます。そして、はい、私はGDが非圧縮データを参照することを認識していますが、圧縮解除されたものを覚えていないかどうかはわかりません。

+0

なぜ、exif_imagetype' 'と何が間違っているのに役立ちますか? – Starx

+0

イメージファイルを開く必要があります。したがって、イメージが別のサーバー上にある場合は、 'exif_imagetype'を呼び出すと2回、実際にイメージをロードするときに2回要求されます。 –

答えて

1
function getImageExt($bytes) 
{ 
    $hex_bytes = ''; 
    for ($i = 0; $i < strlen($bytes); $i++) 
    { 
     $hex_bytes .= dechex(ord($bytes[$i])); 
    } 
    if (strncasecmp($hex_bytes,'FFD8',4) === 0) return 'jpg'; 
    if (strncasecmp($hex_bytes,'474946',6) === 0) return 'gif'; 
    if (strncasecmp($hex_bytes,'89504e47',8) === 0) return 'png'; 
    if (strncasecmp($hex_bytes,'424d',4) === 0) return 'bmp'; 
    return false; 
} 
+0

徹底的なソリューションをありがとうございます。私はそれを受け入れる前にもっと簡潔なものがあるかどうかを待つつもりです(これは何かに組み込まれているようです...)。 –

+0

簡単な質問 - なぜ最初の8バイトだけでなく、 '$ bytes'もすべて変換していますか? –

+0

私はイメージ本体から最初の8バイトをカットするのは発信者の責任であると信じているからです。しかし、それは参照呼び出しに変更することができ、したがって関数内で行うことができます。 –

-1

希望これは

// with GD 
$img = getimagesize($path); 
return $img['mime']; 

// with FileInfo 
$fi = new finfo(FILEINFO_MIME); 
return $fi->file($path); 
+0

ありがとうございますが、どちらもファイルからの読み込みが必要です。イメージが別の場所でホストされている場合は2つの要求があり、後でそのすべてを読みたいと思っています。 –

関連する問題