在 PHP 或 Unix 命令行中确定图像分辨率和文件类型的最快方法?
-
01-07-2019 - |
题
我目前正在使用 ImageMagick 来确定上传到网站的图像的大小。通过在命令行上调用 ImageMagick 的“identify”,大约需要 0.42 秒才能确定 1MB JPEG 的尺寸以及它是 JPEG 的事实。我觉得有点慢。
使用 Imagick PHP 库甚至更慢,因为它在对图像进行任何处理之前尝试将整个 1MB 加载到内存中(在本例中,只需确定其大小和类型)。
是否有任何解决方案可以加快确定任意图像文件的文件类型和尺寸的过程?我可以忍受它只支持 JPEG 和 PNG。对我来说很重要的是,文件类型是通过查看文件头而不仅仅是扩展名来确定的。
编辑:解决方案可以是 PHP 调用的 UNIX 命令行工具,很像我现在使用 ImageMagick 的方式
解决方案
抱歉,我无法将此作为评论添加到之前的答案中,但我没有代表。做了一些快速而肮脏的测试,我还发现 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,您可以尝试 获取图像大小().
你有没有尝试过
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() 更快。
$文件名 = "某个文件";
$data = exif_imagetype($文件名);
回显“<PRE>”;
print_r($数据);
回声“</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().