你可以使用有用一個MemoryStream
,但實際上浪費內存,因爲位圖數據的兩個單獨的副本保存在RAM中:當你加載MemoryStream
時,你做一個副本,該位圖被解碼另一個副本。以這種方式使用MemoryStream
的另一個問題是您繞過緩存。
做到這一點,最好的辦法是使用BitmapCacheOptions.OnLoad從文件直接讀取:
path = @"c:\somePath\somePic.jpg"
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
source.CacheOption = BitmapCacheOption.OnLoad;
source.EndInit(); // Required for full initialization to complete at this time
var img = new System.Windows.Controls.Image { Source = source };
該解決方案是有效的,很簡單。
注意:如果你其實要繞過緩存,例如因爲圖像可以在磁盤上不斷變化的,你還應該設置CreateOption = BitmapCreateOption.IgnoreImageCache
。但即使在這種情況下,該解決方案的性能也超過了MemoryStream
解決方案,因爲它不會將圖像數據的兩個副本保留在RAM中。
Tx,它的工作原理。對於後來的讀者:我已經將它複製到像這樣的內存流:MemoryStream byteStream = new MemoryStream(File.ReadAllBytes(path)); – Peter 2010-03-11 09:04:19
是的,它的工作原理**,但效率低下**因爲:1.圖像數據的兩個副本永遠保留,2.緩存被繞過,因此圖像即使已經在RAM中也被加載。鏈接的文章解釋了#1的解決方法,但它需要很多額外的代碼,仍然不能解決#2。更好的解決方案是將'BitmapCacheOption.OnLoad'與'BeginInit/EndInit'結合。 – 2010-03-11 10:36:26
難道你不能在EndInit之後關閉內存流嗎?爲什麼你需要保持兩個? 。 – Jordan 2015-08-10 14:18:55