C#在没有下载整个文件的情况下获取Web上图像的宽度/高度?

时间:2009-11-23 05:34:30

标签: c# .net windows console

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

4 个答案:

答案 0 :(得分:7)

首先,您可以使用范围标题请求图像的前100个字节。

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

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

对于gifpng,您可以轻松地从前32个字节中获取图像尺寸。但是,对于JPEG,@ Andrew是正确的,因为您无法可靠地获取此信息。你可以弄清楚它是否有缩略图和缩略图的大小。

获取实际的jpeg大小,您需要扫描start of frame标记。不幸的是,人们无法可靠地确定预先确定的位置,并且缩略图可以将数千个字节推入文件中。

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

答案 1 :(得分:2)

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

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

如果你可以开发一个服务器端程序来寻找前进并读取每个段的标题来计算段的宽度和高度,你就可以这样做。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用此代码:

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