5

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

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

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

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

4

7 回答 7

7

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

于 2008-09-18T07:45:08.297 回答
4

你有没有尝试过

identify -ping filename.png

?

于 2008-09-18T08:00:25.373 回答
3

抱歉,我无法将此作为评论添加到先前的答案,但我没有代表。做一些快速而肮脏的测试,我还发现 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);
}
于 2008-09-18T08:53:01.237 回答
2

对我来说重要的是文件类型是通过查看文件的标题而不是简单的扩展名来确定的。

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

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

于 2008-09-18T07:48:43.670 回答
2

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

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

于 2008-09-18T08:49:10.980 回答
1

exif_imagetype() 比 getimagesize() 快。

$filename = "一些文件";
$data = exif_imagetype($filename);
回声“<PRE>”;
打印_r($数据);
回声“</PRE>”;

输出:

大批 (
        [文件名] => 某个文件
        [文件日期时间] => 1234895396
        [文件大小] => 15427
        [文件类型] => 2
        [MimeType] => 图像/jpeg
        [找到的部分] =>
        [计算] => 数组
            (
                [html] => 宽度=“229”高度=“300”
                [身高] => 300
                [宽度] => 229
                [IsColor] => 1
        )
)

于 2009-02-17T18:57:24.027 回答
0

如果您使用的是 PHP,我建议您使用 Imagick 库而不是调用exec(). 您正在寻找的功能是Imagick::pingImage()

于 2013-03-27T11:26:45.297 回答