2012-02-28 20 views
2

如果瀏覽器知道圖像尺寸,則會更快地渲染網頁。但是,我怎樣才能自動分配ASP.NET中的寬度和高度?擴展圖像服務器控件以自動指定圖像尺寸

我可以做一個服務器控件擴展圖像,將使用GDI +查詢圖像大小,並將這些值分配給它自己的寬度和高度屬性。

但也有幾件事情,讓我擔心,想聽取意見:

  • 緩存:什麼是執行緩存的最佳方法是什麼?我想緩存每個圖像的所有頁面的高度和寬度值。
  • 我應該使用哪種方法查詢圖像大小?構造函數或其他方法(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

如果您打算隨時查詢圖像大小,最終可能會讓速度變慢。當然,這一切都取決於你的應用程序如何工作。

如果我嘗試做類似的事情,我會在圖片上傳時獲取圖片尺寸。 (或者當它使用文件系統觀察器創建時)。然後,我會將這些信息存儲在數據庫中,然後對數據庫進行緩存。

+0

圖像是應用程序使用的圖標,因此它們是完全靜態的。 DB是一個超調我認爲 – BCartolo 2012-02-28 19:01:18

1
  1. 如果圖像的大小會改變使用該應用程序的用戶,那麼您將不得不使用會話或Cookie。 否則,如果圖像的大小不會改變(總是相同的大小,用戶無關),那麼最好使用Cache。 我應該使用哪種方法來查詢圖像大小?構造函數或其他方法(OnInit,OnPreRender等等)?

  2. 在PreRender中,因爲此時所有控件都已創建。這是設置控件屬性的最佳時機。

  3. 在你的範圍內,我認爲是。 GDI +針對它進行了優化。

  4. 遠程圖像?

+0

好吧,這是我的想法 – BCartolo 2012-02-28 19:01:40