【发布时间】:2010-12-19 08:54:55
【问题描述】:
我相信对于 JPG,宽度和高度信息存储在 within the first few bytes 中。在给定绝对 URI 的情况下,获取此信息的最简单方法是什么?
【问题讨论】:
我相信对于 JPG,宽度和高度信息存储在 within the first few bytes 中。在给定绝对 URI 的情况下,获取此信息的最简单方法是什么?
【问题讨论】:
使用此代码:
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();
}
}
【讨论】:
Image.FromStream 会起作用吗?
首先,您可以使用 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,则下载整个文件,并使用库获取大小信息。
【讨论】:
有点Heath Robinson,但既然浏览器似乎能够做到这一点,也许你可以自动化 IE 以在网页中下载图像,然后在图像下载完成之前询问浏览器的 DOM 以显示尺寸?
【讨论】:
我对此有点生疏,但是对于 jpeg,它可能不像看起来那么简单。 Jpeg 在每个数据段中都有一个标题,它有自己的高度/宽度和分辨率。 jpeg 的设计不是为了轻松流式传输。您可能需要阅读整个图像以查找 jpeg 中每个片段的宽度和高度,以获得整个宽度和高度。
如果您绝对需要流式传输图像,请考虑更改为更易于流式传输的另一种格式,jpeg 将很难。
如果您可以开发一个服务器端程序,该程序将向前搜索并读取每个段的标题以计算段的宽度和高度,您就可以做到。
【讨论】: