【问题标题】:Get image dimensions with Curl使用 Curl 获取图像尺寸
【发布时间】:2009-05-15 17:42:07
【问题描述】:

我想要一个远程图像的高度*宽度。可以用 Curl 完成吗?如果可以,怎么做?

【问题讨论】:

    标签: php curl


    【解决方案1】:

    getimagesize()是你想要的功能。

    它应该能够下载远程图像并对其进行分析。

    编辑:作为对您问题的更直接回答,Curl 不能直接分析图像,但它当然可以为您获取图像,在这种情况下,您可以使用 GD 库对其进行分析。 getimagesize() 也可以进行获取,因此您可以将 Curl 排除在外。

    【讨论】:

      【解决方案2】:

      希望这篇单独的帖子是有道理的,因为我担心这个答案会作为对我之前帖子的评论而丢失。你问,为什么认为这值得一个单独的帖子?嗯,我想我找到了答案。

      当然,我使用的是 CLI 版本,而不是 libcurl(使用您选择的语言),但在得到可行的答案之前,我一直在摸索。如下:

      curl -r 0-25 --silent http://www.google.com/logos/giroux1.jpg | identify -format "%wx%h" -
      

      在上面的例子中发生的事情是 CURL 使用 -r 标志仅请求文件的前 25 个字节,并将其传送到名为 IDENTIFY 的 imagemagick 命令,在该命令中提取尺寸并以指定的格式打印出来格式。

      有关您可以通过 IDENTIFY 提取的信息的更多信息,请访问http://www.imagemagick.org/script/identify.php

      为了使命令对脚本更友好,我会在末尾添加“2> /dev/null”以抑制错误消息(stderr):

      curl -r 0-25 --silent http://www.google.com/logos/giroux1.jpg | identify -quiet -format "%wx%h" - 2> /dev/null
      

      与尺寸似乎与前 10-20 个字节紧密相关的 GIF 图像不同,从 JPEG 中获取尺寸数据似乎不需要固定数量的字节。更多测试表明,对于大图像,您可能需要最多请求前约 10k 才能获取尺寸数据。一个很好的例子是来自 NASA 的以下 4MB 图像:http://veimages.gsfc.nasa.gov/17921/southern_africa_25jul02_lrg.jpg 我发现不少于 5971 字节将呈现尺寸(10836 x 9324),但我想这比下载整个图像要好。

      重点是...您的里程可能会有所不同,所以请自己尝试一下。

      【讨论】:

        【解决方案3】:

        图像的高度和宽度是图像文件中的属性,您需要检索文件才能访问它们。根据图像格式,此属性将位于图像元数据的不同位置。您可以使用 getimagesize 执行此操作,但请记住,您实际上是在检索完整图像,这将影响您的操作性能。

        如果图像很大,您可以尝试开始将图像传输到您的服务器,一旦您开始接收数据并知道图像的格式,就等到从图像中收到足够的数据以查看在高度和宽度信息并停止传输。您很可能需要自己完成这项工作,因为图像库和 API 中的内置函数可能需要完整的图像才能正常工作。

        如果您偶然控制了图像所在的服务器,您最好编写一个托管在该服务器中的小脚本,该脚本给定图像文件标识符,返回该图像的高度和宽度。

        【讨论】:

          【解决方案4】:

          Curl 无法做到这一点。引用自http://curl.haxx.se/

          块引用 curl 是一个命令行工具,用于使用 URL 语法传输文件,支持 FTP、FTPS、HTTP、HTTPS、SCP、SFTP、TFTP、TELNET、DICT、LDAP、LDAPS 和 FILE。 curl 支持 SSL 证书、HTTP POST、HTTP PUT、FTP 上传、基于 HTTP 表单的上传、代理、cookie、用户+密码身份验证(Basic、Digest、NTLM、Negotiate、kerberos...)、文件传输恢复、代理隧道和大量其他有用的技巧。

          Curl 可用于查看 http 标头并猜测图像类型,但要确定图像的尺寸,您将需要图像本身。

          您可以使用例如。 Python Imaging Library 在图片下载后实际检查尺寸。

          【讨论】:

            【解决方案5】:

            根据 CURL 文档:

            使用 HTTP 1.1 字节范围是 介绍了。使用它,客户可以 要求只得到一个或多个 指定文档的子部分。卷曲 使用 -r 标志支持这一点。

            Get the first 100 bytes of a document:  
                curl -r 0-99 http://www.get.this/
            
            Get the last 500 bytes of a document:  
                curl -r -500 http://www.get.this/
            

            鉴于您可以通过 CURL 仅请求图像的一部分,您可能能够很好地完成您想要做的事情。现在的关键是能够将部分图像传递给 GD(或您选择的应用程序)之类的东西,以提取和报告图像尺寸。

            如果您只使用 JPEG,您的生活会变得更轻松,因为尺寸存储在带有指定标记的标题中的文件开头。在 stackoverflow 上查看另一个名为“Getting Image size of JPEG from its binary”的讨论。

            虽然它需要做更多的工作,但看起来像这样会让你找到正确的标记:

            curl -r 0-999 --url http://www.google.com/logos/giroux1.jpg | grep -n $'\xc0'
            

            我在搜索 JPEG 信息时遇到的其他一些参考来源:

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-12-29
            • 1970-01-01
            • 2011-08-03
            • 1970-01-01
            • 2011-04-22
            • 2011-11-19
            • 2018-03-17
            相关资源
            最近更新 更多