如何在不下载的情况下确定图像的大小(完整)?

时间:2011-09-17 06:18:00

标签: php imagemagick

我希望获得远程托管JPG的尺寸,宽度和高度。我已经看到了如何通过下载完整的图像来实现这一目标。

然而,如果我能够通过下载足够的信息来获取此信息,那将是理想的。

典型的图像尺寸为200K,开头只需几个K 可能就可能足够JPG了:

curl_setopt($ch, CURLOPT_RANGE, "0-4096");

作为参考,我已经按照这些答案/评论但无济于事(虽然它们可能在正确的轨道上):

有没有人能够将这些碎片拼凑在一起(没有ImageMagick)?

4 个答案:

答案 0 :(得分:6)

如何使用ImageMagick的ping功能如下:

identify -ping -format "%wx%h" http://www.google.com/logos/giroux1.jpg
482x142

答案 1 :(得分:4)

根据Getting Image size of JPEG from its binary,图像的大小不会存储在文件中的精确位置。根据扩展名,您可以在实际大小之前在文件中包含大量数据,例如thumbmail。

以下C ++代码应该是您自己的PHP实现的良好开端:http://www.64lines.com/jpeg-width-height。您可以通过访问包含数据的字符串(如数组)来轻松调整此代码:myString{$i}而不是data[i]

您应该加载相对较大的数据块并对其进行解析,然后在必要时加载更多数据。或者您可以逐块加载文件,但是由众多连接引起的开销无法加载整个文件。

无论如何,我不确定这些好处是否足以证明你花在这上面的时间。现在200k都不算什么。

答案 2 :(得分:3)

我设法回答了我自己的问题,并且我已经包含了PHP代码段。

唯一的缺点(至少对我来说)是在使用getImageSize读取尺寸之前将部分图像下载写入文件系统。

对我来说, 10240 字节是检查大小为200到400K的jpg图像的安全限制。

function remoteImage($url){
    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    curl_setopt($ch, CURLOPT_RANGE, "0-10240");

    $fn = "partial.jpg";
    $raw = curl_exec($ch);
    $result = array();

    if(file_exists($fn)){
        unlink($fn);
    }

    if ($raw !== false) {

        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if ($status == 200 || $status == 206) {

            $result["w"] = 0;
            $result["h"] = 0;

            $fp = fopen($fn, 'x');
            fwrite($fp, $raw);
            fclose($fp);

            $size = getImageSize($fn);

            if ($size===false) {
            //  Cannot get file size information
            } else {
            //  Return width and height
                list($result["w"], $result["h"]) = $size;
            }

        }
    }

    curl_close ($ch);
    return $result;
}

答案 3 :(得分:2)

上面的donohoe答案的改进版本。这个检索png和gif文件的较小字节范围,如here所述。

function remoteImage($url){

    $filename = parse_url($url);
    $pi = pathinfo($filename['path'],PATHINFO_EXTENSION);

    switch ($pi) {
    case "jpg" :
        $range = "0-15000";
        break;
    case "jpeg" :
        $range = "0-10000";
        break;
    case "png":
        $range = "0-100";
        break;
    case "gif":
        $range = "0-10";
        break;
    default:
        $range = "0-15000";
        break;
    }

    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    curl_setopt($ch, CURLOPT_RANGE, $range);

    $fn = "partial2.png";
    $raw = curl_exec($ch);
    $result = array();

    if(file_exists($fn)){
        unlink($fn);
    }

    if ($raw !== false) {

        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if ($status == 200 || $status == 206) {

            $result["w"] = 0;
            $result["h"] = 0;

            $fp = fopen($fn, 'x');
            fwrite($fp, $raw);
            fclose($fp);

            $size = getImageSize($fn);

            if ($size===false) {
                //  Cannot get file size information
            } else {
                //  Return width and height
                list($result["w"], $result["h"]) = $size;

            }

        }
    }

    curl_close ($ch);
    return $result;
}