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

时间:2012-02-28 17:02:41

标签: c# asp.net

如果网页知道图片尺寸,浏览器会更快地呈现网页。但是如何自动在ASP.NET中分配宽度和高度?

我可以做一个服务器控件扩展Image,它将使用GDI +查询图像大小,并将这些值分配给它自己的Width和Height属性。

但有几件事令我担心,并希望听到意见:

  • 缓存:实现缓存的最佳方法是什么?我想在每个图像的所有页面上缓存高度和宽度值。
  • 我应该使用哪种方法查询图片大小?构造函数或其他方法(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方法。这可能吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  1. 如果图像的大小会改变使用该应用程序的foreach用户,那么您将不得不使用Session或Cookie。 否则,如果图像的大小不会改变(总是大小相同,与用户无关),那么使用Cache可能会更好。 我应该使用哪种方法来查询图像大小?构造函数或其他方法(OnInit,OnPreRender等)?

  2. 在PreRender中,因为此时已经创建了所有控件。这是设置控件属性的最佳时机。

  3. 在您的范围内,我想是的。 GDI +针对它进行了优化。

  4. 远程图片?

答案 2 :(得分:0)

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

http://www.4guysfromrolla.com/articles/101310-1.aspx