我相信JPG,宽度和高度信息存储within the first few bytes。在给定绝对URI的情况下获取此信息的最简单方法是什么?
答案 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
。
对于gif
和png
,您可以轻松地从前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();
}
}