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

don*_*hoe 11 php imagemagick

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

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

典型的图像是200K大小,在短短的几K读数可能在一开始可能会为JPG格式是不够的:

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

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

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

Mar*_*ell 6

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

identify -ping -format "%wx%h" http://www.google.com/logos/giroux1.jpg
482x142
Run Code Online (Sandbox Code Playgroud)


krt*_*tek 5

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

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

您应该加载相对较大的数据块并对其进行解析,然后在必要时加载更多数据。或者,您可以逐块加载文件,但是大量连接带来的开销违背了不加载整个文件的目的。

不管怎样,我不确定这些好处是否值得你花在这上面的时间。现在200k已经不算什么了。


don*_*hoe 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;
}
Run Code Online (Sandbox Code Playgroud)