2011-09-25 58 views
4

我正在採取Stream將其轉換爲Image,處理該圖像,然後返回FileStream流到圖像並返回

這是一個性能問題?如果不是,那麼轉換和返回流的優化方式是什麼?

public FileStream ResizeImage(int h, int w, Stream stream) 
{ 
     var img = Image.FromStream(stream); 

     /* ..Processing.. */ 

     //converting back to stream? is this right? 
     img.Save(stream, ImageFormat.Png); 

     return stream; 
} 

的情況是,這是運行:用戶上傳圖片在我的網站(控制器給了我一個流,我調整這一點,然後把這個流Rackspace公司(Rackspace公司需要FileStream

+3

你是否存在性能問題? – Oded

+2

@Oded,我不必從一開始就寫性能問題來編寫優化的代碼。 –

+0

這取決於優化。如果你知道代碼表現不佳,是的,做優化。但規則應該是:優化前的衡量。 – Oded

回答

9

你。基本上想是這樣的,你不:

public void Resize(Stream input, Stream output, int width, int height) 
{ 
    using (var image = Image.FromStream(input)) 
    using (var bmp = new Bitmap(width, height)) 
    using (var gr = Graphics.FromImage(bmp)) 
    { 
     gr.CompositingQuality = CompositingQuality.HighSpeed; 
     gr.SmoothingMode = SmoothingMode.HighSpeed; 
     gr.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     gr.DrawImage(image, new Rectangle(0, 0, width, height)); 
     bmp.Save(output, ImageFormat.Png); 
    } 
} 

將用於這樣的:

using (var input = File.OpenRead("input.jpg")) 
using (var output = File.Create("output.png")) 
{ 
    Resize(input, output, 640, 480); 
} 
0

看起來儘可能簡單。您必須閱讀整個圖像內容才能夠處理它,並且必須將結果寫回。

FileStreams是正常的.NET處理文件的方式,因此對於正常的目的,您的方法沒問題。

我不明白的唯一原因就是爲什麼您再次返回FileStream - 它與參數傳遞的對象相同。

如果您正在製作大量圖像並只修改部分數據,則內存映射文件可以提高性能。然而,這是一個更先進的概念使用。