PHP または Unix コマンド ラインで画像の解像度とファイル タイプを確認する最速の方法は?
-
01-07-2019 - |
質問
現在、Web サイトにアップロードされる画像のサイズを決定するために ImageMagick を使用しています。コマンドラインで ImageMagick の「identify」を呼び出すと、1MB の JPEG のサイズとそれが JPEG であるという事実を判断するのに約 0.42 秒かかります。それは少し遅いと思います。
Imagick PHP ライブラリを使用すると、画像に対する処理 (この場合は単にサイズとタイプを決定するだけ) を行う前に 1MB 全体をメモリにロードしようとするため、さらに遅くなります。
任意の画像ファイルのファイル タイプとサイズを判断するこのプロセスを高速化する解決策はありますか?JPEG と PNG のみをサポートするだけで十分です。私にとって重要なのは、ファイルの種類は拡張子だけではなく、ファイルのヘッダーを見て判断されるということです。
編集:解決策は、私が現在 ImageMagick を使用している方法とよく似た、PHP によって呼び出されるコマンドライン ツール UNIX です。
解決
申し訳ありませんが、これを以前の回答にコメントとして追加することはできませんが、担当者がいません。いくつかの簡単で汚いテストを行ったところ、exec("identify -ping...-ping を使用しない場合よりも約 20 倍高速になります。しかし、getimagesize() はまだ約 200 倍高速であるようです。
したがって、getimagesize() の方が高速な方法だと思います。私はjpgでのみテストし、pngではテストしませんでした。
テストはただです
$files = array('2819547919_db7466149b_o_d.jpg', 'GP1-green2.jpg', 'aegeri-lake-switzerland.JPG');
foreach($files as $file){
$size2 = array();
$size3 = array();
$time1 = microtime();
$size = getimagesize($file);
$time1 = microtime() - $time1;
print "$time1 \n";
$time2 = microtime();
exec("identify -ping $file", $size2);
$time2 = microtime() - $time2;
print $time2/$time1 . "\n";
$time2 = microtime();
exec("identify $file", $size3);
$time2 = microtime() - $time2;
print $time2/$time1 . "\n";
print_r($size);
print_r($size2);
print_r($size3);
}
他のヒント
GD サポート付きの PHP を使用している場合は、試してみることができます getimagesize().
やってみました
identify -ping filename.png
?
私にとって重要なのは、ファイルの種類は拡張子だけではなく、ファイルのヘッダーを見て判断されるということです。
そのためには、「file」unix コマンド (または同じ機能を実装する php 関数) を使用できます。
/tmp$ file stackoverflow-logo-250.png
stackoverflow-logo-250.png: PNG image data, 250 x 70, 8-bit colormap, non-interlaced
実際、getimagesize() を使用するには、次のようにします。 ない GD をコンパイルする必要があります。
mime_content_type() を使用して MIME タイプを取得することもできます。
exif_imagetype() は getimagesize() より高速です。
$filename = "何らかのファイル";
$data = exif_imagetype($filename);
エコー "<PRE>";
print_r($data);
エコー「</PRE>」;
出力:
Array ( [FileName] => somefile [FileDateTime] => 1234895396 [FileSize] => 15427 [FileType] => 2 [MimeType] => image/jpeg [SectionsFound] => [COMPUTED] => Array ( [html] => width="229" height="300" [Height] => 300 [Width] => 229 [IsColor] => 1 ) )
PHP を使用している場合は、呼び出すのではなく Imagick ライブラリを使用することをお勧めします。 exec()
. 。あなたが探している機能は Imagick::pingImage().