扩展图像服务器控件以自动指定图像尺寸

本文关键字:图像 服务器控件 扩展 | 更新日期: 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方法。这可能吗?

扩展图像服务器控件以自动指定图像尺寸

如果要动态查询图像大小,可能会使速度变慢。当然,这完全取决于应用程序的工作方式。

如果我尝试做类似的事情,我会在上传图像时获得图像尺寸。(或者当它是使用文件系统观察器创建的)。然后我会将这些信息存储在数据库中,然后缓存到数据库中。

  1. 如果每个使用该应用程序的用户的图像大小都会发生变化,那么您将不得不使用Session或Cookie。否则,如果图像的大小不会改变(总是相同的大小,独立于用户),那么最好使用Cache。我应该使用哪种方法来查询图像大小?构造函数或其他方法(OnInit、OnPreRender等)?

  2. 在预渲染中,因为此时所有控件都已创建。现在是设置控件属性的最佳时机。

  3. 在你的范围内,我认为是的。GDI+是为它优化的。

  4. 远程图像?

我将使用生成精灵并写入图像宽度和高度的图像优化框架,因此无需重新发明轮子。

https://web.archive.org/web/20211020150102/https://www.4guysfromrolla.com/articles/101310-1.aspx