我从指定网址的网页上获取了一些图片,我希望得到它们的高度和宽度.我正在使用这样的东西:
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的情况下获取图像?或者是否有更好的替代方法从网页获取图像的尺寸?
谢谢
某些(全部?)图像格式包括文件标题中的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)
| 归档时间: |
|
| 查看次数: |
5716 次 |
| 最近记录: |