如果网页知道图片尺寸,浏览器会更快地呈现网页。但是如何自动在ASP.NET中分配宽度和高度?
我可以做一个服务器控件扩展Image,它将使用GDI +查询图像大小,并将这些值分配给它自己的Width和Height属性。
但有几件事令我担心,并希望听到意见:
当然我知道如何做我提到的所有事情,但我想听听一些想法。
http://code.google.com/speed/page-speed/docs/rendering.html#SpecifyImageDimensions
编辑:这是我到目前为止所做的:
[ToolboxData("<{0}:AutoSizeImage runat=server></{0}:AutoSizeImage>")]
public class AutoSizeImage : Image
{
protected override void OnPreRender(EventArgs e)
{
if (Width.Value + Height.Value == 0)
{
if (IsLocal(ImageUrl))
{
using (System.Drawing.Image img = System.Drawing.Image.FromFile(Context.Server.MapPath(ImageUrl)))
{
Width = img.Width;
Height = img.Height;
}
}
else
{
System.Net.WebRequest request = System.Net.WebRequest.Create(ImageUrl);
using (System.Net.WebResponse response = request.GetResponse())
using (System.IO.Stream responseStream = response.GetResponseStream())
using (System.Drawing.Image img = System.Drawing.Image.FromStream(responseStream))
{
Width = img.Width;
Height = img.Height;
}
}
}
base.OnPreRender(e);
}
private bool IsLocal(string p)
{
return !(p.StartsWith("http://") || p.StartsWith("https://") || p.StartsWith("ftp://"));
}
}
它工作得很漂亮,但我现在需要实现缓存。 我想为ImageUrl的每个值缓存此控件的输出,也就是说,我希望为每个图像调用一次OnPreRender方法。这可能吗?
答案 0 :(得分:1)
如果您要动态查询图像大小,最终可能会使速度变慢。当然,这完全取决于您的应用程序的工作方式。
如果我尝试做类似的事情,我会在上传图片时获得图片尺寸。 (或者使用文件系统观察器创建时)。然后,我会将此信息存储在数据库中,然后根据数据库进行缓存。
答案 1 :(得分:1)
如果图像的大小会改变使用该应用程序的foreach用户,那么您将不得不使用Session或Cookie。 否则,如果图像的大小不会改变(总是大小相同,与用户无关),那么使用Cache可能会更好。 我应该使用哪种方法来查询图像大小?构造函数或其他方法(OnInit,OnPreRender等)?
在PreRender中,因为此时已经创建了所有控件。这是设置控件属性的最佳时机。
在您的范围内,我想是的。 GDI +针对它进行了优化。
远程图片?
答案 2 :(得分:0)
我将使用生成精灵的图像优化框架并写入图像的宽度和高度,因此无需重新发明轮子。