在 PHP 或 Unix 命令行中确定图像分辨率和文件类型的最快方法?

在 PHP 或 Unix 命令行中确定图像分辨率和文件类型的最快方法?

Fastest way to determine image resolution and file type in PHP or Unix command line?

我目前正在使用 ImageMagick 来确定上传到网站的图像的大小。通过在命令行上调用 ImageMagick\\'s "identify",大约需要 0.42 秒来确定 1MB JPEG\\ 的尺寸以及它是 JPEG 的事实。我觉得这有点慢。

使用 Imagick PHP 库甚至更慢,因为它会在对图像进行任何处理之前尝试将整个 1MB 加载到内存中(在这种情况下,只需确定其大小和类型)。

是否有任何解决方案可以加快确定任意图像文件的文件类型和尺寸的过程?我可以忍受它只支持JPEG和PNG。对我来说重要的是文件类型是通过查看文件的标题而不是扩展名来确定的。

编辑:解决方案可以是一个由 PHP 调用的命令行工具 UNIX,很像我现在使用 ImageMagick 的方式


如果你使用支持 GD 的 PHP,你可以试试 getimagesize()。


你试过了吗

1
identify -ping filename.png

?


抱歉,我无法将此作为评论添加到先前的答案,但我没有代表。进行一些快速而肮脏的测试,我还发现 exec("identify -ping... 比没有 -ping 时快 20 倍左右。但 getimagesize() 似乎仍然快 200 倍左右。

所以我会说 getimagesize() 是更快的方法。我只测试了 jpg 而不是 png.

测试只是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$files = array('2819547919_db7466149b_o_d.webp', 'GP1-green2.webp', 'aegeri-lake-switzerland.JPG');
foreach($files as $file){
  $size2 = array();
  $size3 = array();
  $time1 = microtime();
  $size = getimagesize($file);
  $time1 = microtime() - $time1;
  print"$time1 \
"
;
  $time2 = microtime();
  exec("identify -ping $file", $size2);
  $time2 = microtime() - $time2;
  print $time2/$time1 ."\
"
;
  $time2 = microtime();
  exec("identify $file", $size3);
  $time2 = microtime() - $time2;
  print $time2/$time1 ."\
"
;
  print_r($size);
  print_r($size2);
  print_r($size3);
}

实际上,使用getimagesize(),你不需要编译GD。

您也可以使用 mime_content_type() 来获取 MIME 类型。


It's important to me that the file type is determined by looking at the file's headers and not simply the extension.

为此,您可以使用 'file' unix 命令(或者实现相同功能的一些 php 函数)。

/tmp$ file stackoverflow-logo-250.webp
stackoverflow-logo-250.webp: PNG image data, 250 x 70, 8-bit colormap, non-interlaced


exif_imagetype() 比 getimagesize() 快。

$filename ="一些文件";
$data = exif_imagetype($filename);
回声"前";
打印_r($数据);
回声"/前";

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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().


推荐阅读

    纯命令行linux服务器?

    纯命令行linux服务器?,密码,服务,系统,命令,终端,地址,百度,情况,状态,公共,

    linux中同步命令行?

    linux中同步命令行?,时间,系统,服务,图片,统一,中国,信息,命令,界面,硬件,LIN

    linuxvim命令行?

    linuxvim命令行?,系统,代码,模式,入口,基础,环境,命令,文件,编辑,文本,Linux

    linux提交程序命令行?

    linux提交程序命令行?,工作,系统,信息,地址,工程,目录,管理,环境,命令,功能,L

    linux复制几行命令行?

    linux复制几行命令行?,系统,位置,基本知识,设备,软件,文件,命令,源文件,连

    linux本地ip命令行?

    linux本地ip命令行?,地址,网络,系统,信息,电脑,状态,中心,设备,名称,数字,查

    linux设备加载命令行?

    linux设备加载命令行?,设备,系统,信息,数字,首页,软件,密码,终端,文件,键盘,L

    linux清理内存命令行?

    linux清理内存命令行?,策略,数据,系统,名称,不了,管理,情况,工作,一致,时间,l

    linux命令行显示路径?

    linux命令行显示路径?,系统,数据,信息,命令,工作,时间,标准,文件,目录,名称,l

    linux命令行加载中文?

    linux命令行加载中文?,名称,系统,不了,传播,网上,状态,管理,中文,终端,命令,L

    linux合并行命令行?

    linux合并行命令行?,工作,系统,地址,信息,文件,代码,目录,命令,功能,内容,Lin

    linux命令行网口速率?

    linux命令行网口速率?,网络,地址,数据,设备,一致,工具,网址,分析,工作,电脑,l

    linux切到命令行尾?

    linux切到命令行尾?,系统,密码,命令,电脑,数字,状态,实时,文件,模式,界面,Lin

    linux命令行下载太慢?

    linux命令行下载太慢?,软件,代理,工具,密码,网络,较大,网站,认证,时间,工作,

    linux命令行管理员?

    linux命令行管理员?,系统,管理,密码,代码,地址,软件,服务,工具,部门,预警,LIN

    linux设置日志命令行?

    linux设置日志命令行?,异常,系统,实时,日志,管理,信息,对比,项目,名称,情况,L

    linux修改网关命令行?

    linux修改网关命令行?,地址,代码,系统,网络,信息,网关,服务,密码,环境,数字,

    linux命令行vi使用?

    linux命令行vi使用?,系统,管理,状态,命令,模式,正规,工作,标准,编辑,字符,lin

    linux文件替换命令行?

    linux文件替换命令行?,资料,命令,文件,数据,名称,系统,实时,工作,字符串,批

    linux命令行自启动?

    linux命令行自启动?,服务,系统,脚本,设备,人员,工具,密码,最新,实时,代码,lin