扩展图像服务器控件以自动指定图像尺寸
本文关键字:图像 服务器控件 扩展 | 更新日期: 2023-09-27 18:26:07
如果浏览器知道图像的尺寸,它会更快地渲染网页。但是如何在ASP.NET中自动分配宽度和高度?
我可以做一个扩展Image的服务器控件,该控件将使用GDI+查询图像大小,并将这些值分配给它自己的Width和Height属性。
但有几件事让我担心,我想听听意见:
- 缓存:实现缓存的最佳方式是什么?我想缓存每个图像的所有页面的"高度"answers"宽度"值
- 我应该使用哪种方法来查询图像大小?构造函数或其他方法(OnInit、OnPreRender等)
- 它是GDI+查询图像大小的最佳选项,还是有其他有效的方法
- 如何查询遥控器图像的大小
当然,我知道如何做我提到的所有事情,但我想听听一些想法。
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方法。这可能吗?
如果要动态查询图像大小,可能会使速度变慢。当然,这完全取决于应用程序的工作方式。
如果我尝试做类似的事情,我会在上传图像时获得图像尺寸。(或者当它是使用文件系统观察器创建的)。然后我会将这些信息存储在数据库中,然后缓存到数据库中。
-
如果每个使用该应用程序的用户的图像大小都会发生变化,那么您将不得不使用Session或Cookie。否则,如果图像的大小不会改变(总是相同的大小,独立于用户),那么最好使用Cache。我应该使用哪种方法来查询图像大小?构造函数或其他方法(OnInit、OnPreRender等)?
-
在预渲染中,因为此时所有控件都已创建。现在是设置控件属性的最佳时机。
-
在你的范围内,我认为是的。GDI+是为它优化的。
-
远程图像?
我将使用生成精灵并写入图像宽度和高度的图像优化框架,因此无需重新发明轮子。
https://web.archive.org/web/20211020150102/https://www.4guysfromrolla.com/articles/101310-1.aspx