【问题标题】:C# get width/height of image on web without downloading whole file?C#在不下载整个文件的情况下获取网络上图像的宽度/高度?
【发布时间】:2010-12-19 08:54:55
【问题描述】:

我相信对于 JPG,宽度和高度信息存储在 within the first few bytes 中。在给定绝对 URI 的情况下,获取此信息的最简单方法是什么?

【问题讨论】:

标签: c# .net windows console


【解决方案1】:

使用此代码:

public static async Task<Size> GetUrlImageSizeAsync(string url)
{
    try
    {
        var request = WebRequest.Create(url);
        request.Headers.Set(HttpRequestHeader.UserAgent, "Range: bytes=0-32");

        var size = new Size();
        using (var response = await request.GetResponseAsync())
        {
            var ms = new MemoryStream();
            var stream = response.GetResponseStream();
            stream.CopyTo(ms);

            var img = Image.FromStream(ms);
            size = img.Size;
        }

        return size;
    }
    catch
    {
        return new Size();
    }
}

【讨论】:

  • 如果你只给它前 32 个字节,Image.FromStream 会起作用吗?
【解决方案2】:

首先,您可以使用 Range 标头请求图像的前一百字节。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Set(HttpRequestHeader.UserAgent, "Range: bytes=0-100");

接下来,您需要解码。 unix file command 有一个常用格式表和关键信息的位置。我建议安装 Cygwin 并查看 /usr/share/file/magic

对于gif's 和png's,您可以轻松地从前 32 个字节获取图像尺寸。但是,对于 JPEG,@Andrew 是正确的,因为您无法可靠地获取此信息。您可以确定它是否有缩略图,以及缩略图的大小。

获取实际jpeg大小,需要扫描start of frame标签。不幸的是,人们无法提前可靠地确定它的位置,而缩略图可能会将数千字节推入文件中。

我建议使用 range 请求来获取前 32 个字节。这将让您确定文件类型。之后,如果是 JPEG,则下载整个文件,并使用库获取大小信息。

【讨论】:

  • 我认为 99% 的图像将是 JPG... 处理 1% 的情况似乎需要做很多工作。很好的建议,很高兴知道你可以做到这一点。我想我能做的是检查文件大小,如果是最小大小,则将整个文件下载到内存中,然后检查它的真实图像尺寸,如果太小则丢弃它。
  • 我猜你应该得到检查以最彻底地回答问题。然而,Matthew Lock 在他的评论中回答了问题 :)
【解决方案3】:

有点Heath Robinson,但既然浏览器似乎能够做到这一点,也许你可以自动化 IE 以在网页中下载图像,然后在图像下载完成之前询问浏览器的 DOM 以显示尺寸?

【讨论】:

  • 尽管来自各种奇怪的 jpeg,但您将无法击败浏览器以最少的下载数据获取图像尺寸的能力。
【解决方案4】:

我对此有点生疏,但是对于 jpeg,它可能不像看起来那么简单。 Jpeg 在每个数据段中都有一个标题,它有自己的高度/宽度和分辨率。 jpeg 的设计不是为了轻松流式传输。您可能需要阅读整个图像以查找 jpeg 中每个片段的宽度和高度,以获得整个宽度和高度。

如果您绝对需要流式传输图像,请考虑更改为更易于流式传输的另一种格式,jpeg 将很难。

如果您可以开发一个服务器端程序,该程序将向前搜索并读取每个段的标题以计算段的宽度和高度,您就可以做到。

【讨论】:

  • 哦,我无法选择图像格式或任何服务器控件(否则我会将宽度/高度存储在数据库中,或者让操作系统为我读取)。我正在挖掘数据并希望节省下载时间/带宽。只对大图感兴趣 :)
  • Web 浏览器不是一直流式传输 JPG 吗?我很确定我的浏览器在完全下载完成之前就知道图片的大小。
  • 我不确定。尝试搜索是否可以从 Web 服务器本身请求宽度和高度。 Web 服务器可能会告诉浏览器图像的大小。
  • “只对大图像感兴趣”也许在这种情况下,您可以对图像文件执行 HTTP HEAD 并查看图像文件有多大(但以字节为单位而不是像素)并将其用作指标?
  • Nvm。这个stackoverflow.com/questions/122853/c-get-http-file-size 回答了我的另一个问题。谢谢! :D
猜你喜欢
  • 2016-10-09
  • 2014-09-13
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多