在网络上获取图像的尺寸 - 避免记忆猪?

rak*_*los 4 c# asp.net

我从指定网址的网页上获取了一些图片,我希望得到它们的高度和宽度.我正在使用这样的东西:

 Stream str = null;
 HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(ImageUrl);
 HttpWebResponse wRes = (HttpWebResponse)(wReq).GetResponse();
 str = wRes.GetResponseStream();

 var imageOrig = System.Drawing.Image.FromStream(str);
 int height = imageOrig.Height;
 int width = imageOrig.Width;
Run Code Online (Sandbox Code Playgroud)

我主要担心的是图像文件实际上可能非常大,

有什么我能做的吗?即指定仅在小于1mb的情况下获取图像?或者是否有更好的替代方法从网页获取图像的尺寸?

谢谢

Chr*_*ris 5

某些(全部?)图像格式包括文件标题中的width和height属性.您可以只请求足够的字节来读取标头,然后自己解析它们.您可以向Web请求添加范围标题,该请求仅请求前50个字节(50只是一个示例,您可能需要更少)的图像文件:

wReq.AddRange(0, 50);
Run Code Online (Sandbox Code Playgroud)

我想这只有在你知道你正在使用的格式包含这些数据时才有效.

编辑:看起来我AddRange以前误解了这个方法.现在已经修好了.我还通过使用此文档获取png的宽度和高度来进行测试.

static void Main(string[] args)
{
    string imageUrl = "http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png";
    byte[] pngSignature = new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 };
    HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(imageUrl);
    wReq.AddRange(0, 30);
    WebResponse wRes = wReq.GetResponse();
    byte[] buffer = new byte[30];
    int width = 0;
    int height = 0;

    using (Stream stream = wRes.GetResponseStream())
    {
        stream.Read(buffer, 0, 30);
    }

    // Check for Png
    // 8 byte - Signature
    // 4 byte - Chunk length
    // 4 byte - Chunk type - IDHR (Image Header)
    // 4 byte - Width
    // 4 byte - Height
    // Other stuff we don't care about
    if (buffer.Take(8).SequenceEqual(pngSignature))
    {
        var idhr = buffer.Skip(12);
        width = BitConverter.ToInt32(idhr.Skip(4).Take(4).Reverse().ToArray(), 0);
        height = BitConverter.ToInt32(idhr.Skip(8).Take(4).Reverse().ToArray(), 0);
    }
    // Check for Jpg
    //else if (buffer.Take(?).SequenceEqual(jpgSignature))
    //{
    //    // Do Jpg stuff
    //}
    // Check for Gif
    //else if (etc...

    Console.WriteLine("Width: " + width);
    Console.WriteLine("Height: " + height);
    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)