2009-12-17 16 views
1

我不善於提出一個問題,隨意重新說明/重新標記這使它更容易理解。謝謝。圖像代理的性能

我有一個圖像代理頁面可以幫助我處理產品圖像的所有請求與自定義操作值。例如:

http://mysite.com/ImageProxy.aspx?id={ITEM ID}&width={WIDTH}&height={HEIGHT}&gloss={GLOSS}&reflection={REFLECTION} 

爲了減少服務器端的負荷,我緩存通過保存已生成的圖像文件進行重新利用相同的操控值相同的產品被調用時。

這可以在開始時使用,但在單頁顯示更多圖像時會變慢。 我想知道我可以如何改善這種情況,或者是圖像代理往往是由它的自然慢?

*編輯:*

我:

  • 使用ASP.NET MVC
  • System.Drawing.Drawing2DSystem.Drawing.Imaging處理圖像與發展。
  • 目前每個圖片的頁面大小約爲500kb(結果頁面),每頁8〜10個圖片,每個圖片30〜50kb(PNG)。
  • 圖像目前是PNG透明度作爲反射和圓角效果,因爲那裏的選項和圖像可能坐在各種背景固體背景顏色(即/ GIF可能是一個選項)。
+0

如果您發佈了代碼的關鍵部分,這將有所幫助。另外,這些圖像有多大?他們來自數據庫嗎? – 2009-12-17 03:29:05

+0

由「費用~500kb」你的意思是總頁大小爲500kb?或者每個頁面呈現時服務器上的內存使用量增加500kb? – 2009-12-17 03:30:43

+0

@Mike,ImageProxy.aspx頁面使用一個Web服務(名爲'ImageBuilder'),這是一個由團隊編寫的自定義庫,不能輕易將代碼片段作爲示例。至於「費用〜500kb」,我的意思是結果頁面的總大小。我沒有監視服務器的內存使用情況。 – 2009-12-17 04:02:07

回答

3

試試這個:

// GetCacheFileName -> Returns the full path of the "cached" image 
    // CreateImage -> Used to create a new image if necessary 
    string cacheFile = GetCacheFileName(param1, param2, param3, param4); 
    if (!File.Exists(cacheFile)) 
    { 
     Image cacheImage = CreateImage(param1, param2, param3, param4); 
     cacheImage.Save(cacheFile, ImageFormat.Jpeg); 
    } 

    Response.ContentType = "image/jpeg"; 
    Response.TransmitFile(cacheFile); 

的兩件事情這裏需要注意的是:

  • 告訴框架圖像
  • 保存文件保存爲JPEG到磁盤,並使用響應.TransmitFile代替Response.WriteFile或Response.OutputStream.Write
+0

由於需要透明度和不透明度,輸出總是PNG(儘管原始文件是JPG)。你也可以詳細說明使用'Response.TransmitFile'而不是'Response.OutputStream.Write'(我目前使用的)的理由嗎?謝謝。 – 2009-12-17 04:53:30

+0

我建議JPEG只是爲了儘量減少文件的大小,因爲其中一個問題是頁面的整體大小。只要您使用適當的內容類型,該建議仍然可以與PNG一起使用。而且你應該使用Response.TransmitFile,因爲它不會在傳輸到客戶端之前將整個文件加載到內存中,因此速度更快,資源更少。 – Badaro 2009-12-17 11:00:20