2012-12-11 6 views
5

Mam wiele obrazów w folderze zasobów projektu, które muszę załadować do pamięci na początku aplikacji. Jaki jest najlepszy sposób na zmniejszenie obciążenia procesora i czasu.Najlepszy sposób na załadowanie zdjęć do pamięci?

Robię to:

for (int i = 0; i < 10; i++) 
     { 
      var smallBitmapImage = new BitmapImage 
      { 
       UriSource = new Uri(string.Format("ms-appx:/Assets/Themes/{0}/{1}-small-digit.png", themeName, i), UriKind.Absolute) 
      }; 

      theme.SmallDigits.Add(new ThemeDigit<BitmapImage> { Value = i, BitmapImage = smallBitmapImage, Image = string.Format("ms-appx:/Assets/Themes/{0}/{1}-small-digit.png", themeName, i) }); 
     } 

a potem powiązać tę BitmapImage do kontroli obrazu.

Ale nie jestem do końca pewien, czy ustawienie UriSource faktycznie załaduje obraz do pamięci.

Widziałem również właściwość SetSourceAsync dla BitmapImage. Ale nie jestem pewien, jak go użyć w moim kontekście. Czy ktoś może mi pomóc z obu nieruchomości SetSourceAsync lub najlepszy sposób załadować obrazy ....

Dzięki

+0

Ja też mam ten sam problem. Wygląda na to, że WinRT jest bardzo leniwy w ładowaniu obrazów ... – satur9nine

Odpowiedz

1

Ponieważ nie chciałem zła odpowiedź do pokazania muszę dodać kolejną odpowiedź 10 sekund później ...

Przykłady:

BitmapImage image1 = LoadImageToMemory("C:\\image.png"); 
BitmapImage image2 = LoadImageToMemory(webRequest.GetResponse().GetResponseStream()); 

public BitmapImage LoadImageToMemory(string path) 
{ 
     BitmapImage image = new BitmapImage(); 

     try 
     { 
      image.BeginInit(); 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      System.IO.Stream stream = System.IO.File.Open(path, System.IO.FileMode.Open); 
      image.StreamSource = new System.IO.MemoryStream(); 
      stream.CopyTo(image.StreamSource); 
      image.EndInit(); 

      stream.Close(); 
      stream.Dispose(); 
      image.StreamSource.Close(); 
      image.StreamSource.Dispose(); 
     } 
     catch { throw; } 

     return image; 
} 

// Albo użyć System.Net.WebRequest() GetResponse() GetResponseStream()

.. 0
+0

Dodałem odpowiedź, którą sobie uświadomiłem, było złe, więc napisałem po prostu, że mam zamiar to naprawić, ten przykład działa, a nie wcześniejszy. – Deukalion

+0

Hej, dziękuję za odpowiedź, ale niestety działa to tylko dla aplikacji WPF, a nie aplikacji WInRT. The BitmapImage u r odnoszące się do jest w "System.Windows.Media.Imaging", ale dla aplikacji WinRT BitmapImage jest w "Windows.UI.Xaml.Media.Imaging". A wszystkie właściwości, takie jak StreamSource itp., Nie są dostępne w wersji WinRT – Bitsian

+0

Możesz odnieść się do tego łącza dla wszystkich właściwości dostępnych w WinRT http://msdn.microsoft.com/library/windows/apps/BR243235 – Bitsian

0

W przypadku korzystania System.Drawing nazw, łatwiej jest inicjowanie obraz ze strumienia:

try 
{ 
    var req = WebRequest.Create(photoUrl); 

    using (var response = req.GetResponse()) 
    { 
    using (var stream = response.GetResponseStream()) 
    { 
     if (stream != null) 
     { 
     var image = Image.FromStream(stream); 
     } 
    } 
    } 
} 
catch (Exception ex) 
{ 
    // handle exception 
}