2012-12-11 62 views
4

可能這聽起來很愚蠢,但是,哪一個是加載圖像最有效的方式?WPF最有效的加載方式圖片

一個

BitmapImage bmp = new BitmapImage(); 
using(FileStream fileStream = new FileStream(source_path, FileMode.Open)) 
{ 
    bmp.BeginInit(); 
    bmp.CacheOption = BitmapCacheOption.OnLoad; 
    bmp.StreamSource = fileStream; 
    bmp.EndInit(); 
    if (bmp.CanFreeze) 
     bmp.Freeze(); 

    images.source = bmp; 
} 

BitmapImage bmp = new BitmapImage(); 
bmp.BeginInit(); 
bmp.CacheOption = BitmapCacheOption.OnLoad; 
bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
bmp.UriSource = new Uri(source_path); 
bmp.EndInit(); 
if (bmp.CanFreeze) 
    bmp.Freeze(); 

images.Source = bmp; 

我記得我從一個流中讀取的地方,裝載完全禁用緩存。如果這是真的,是否意味着從內存管理角度來看,從流中加載更好?

+0

您最終需要在case A中處理'fileStream'。 – usr

+1

你能用秒錶來測量嗎? – kenny

+0

@usr是的。代碼已更新。 – Reyn

回答

1

據我瞭解,當您通過設置其UriSource屬性加載BitmapImage時,圖像總是被緩存。我不知道有什麼辦法可以避免這種情況。至少設置BitmapCreateOptions.IgnoreImageCache只能確保不從緩存中檢索圖像,但它不會阻止圖像存儲在緩存中。

BitmapCreateOptions「備註」說,

當選擇IgnoreImageCache,在圖像 緩存中的任何現有條目,即使它們共享相同的URI

我從這個結論所取代緩存是只有當一個圖像被Uri加載時執行。換句話說,如果您確實需要禁止圖像緩存,則必須通過其StreamSource屬性加載圖像。但是,如果這在內存管理方面真的「更好」,那麼可能值得一個實驗。你可以嘗試兩種選擇,看看你是否觀察到任何顯着的內存消耗差異。

+0

這就是爲什麼我問這個問題。我已經嘗試了兩種方法,但沒有看到太大的區別。但是,通過使用流而不是存儲圖像緩存的邏輯,我認爲它應該在內存消耗方面更好 – Reyn

+1

如果您沒有看到差異,則應始終選擇「更容易」的解決方案,即使用較少代碼的解決方案。我想這就是UriSource之一,因爲你不需要處理Stream對象。 – Clemens