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


我想要获得远程托管JPG的尺寸,宽度和高度。我已经看到通过下载完整图像可以做到这一点。

但是,如果我可以通过下载足够只是获取此信息来做到这一点将是理想的。

典型的图像尺寸为200K,读数仅为几K. 威力 在开始时可能足够JPG:

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

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

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


11018
2017-09-17 06:17


起源

你尝试过什么?您对JPEG文件格式的理解是什么?看看你能拼凑起来的东西 en.wikipedia.org/wiki/Exchangeable_image_file_format#Example - tripleee
我尝试在前4096字节读取并且未能找到对它运行Imagemagick'identific'或'grep -n $ \ xc0'(参见引用的问题/评论)。 - donohoe


答案:


如何使用ImageMagick ping 这样的功能:

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

6
2018-04-02 10:11



哇,甚至都不知道 -ping!测试表明它只是稍微快一点,但保存了下载临时文件的步骤。 - bigjosh


根据 从二进制文件中获取JPEG的图像大小,图像的大小不存储在文件中的精确位置。根据扩展名,您可以在实际大小之前在文件中包含大量数据,例如thumbmail。

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

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

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


4
2017-09-17 07:01



我会检查,但对我来说可能太多了。 200K不是很多,是真的 - 但它会达到每天约500 + mb,尽管我目前的方法是全部下载它们。 - donohoe


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

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

为了我 10240 bytes是检查大小为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
2017-09-19 19:17



优秀的解决方案,它适合我。谢谢 - ahoo


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

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;
}

2
2018-04-01 21:57