2012-12-11 11 views
5

Ich habe eine Menge Bilder in meinem Asset-Ordner des Projekts, die ich am Anfang der App in den Speicher laden muss. Was ist der beste Weg, um CPU-Last und Zeit zu reduzieren?Der beste Weg, Bilder in den Speicher zu laden?

Ich tue dies:

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) }); 
     } 

Und dann die Kontrolle i binden diese Bitmap zu einem Bild.

Aber ich bin mir nicht sicher, ob das Setzen der UriSource tatsächlich das Bild in den Speicher lädt.

Ich sah auch die SetSourceAsync-Eigenschaft für BitmapImage. Aber ich bin mir nicht sicher, wie ich es in meinem Kontext verwenden soll. Kann mir jemand bitte entweder die SetSourceAsync Eigenschaft oder die beste Art und Weise helfen, die Bilder zu laden ....

Dank

+0

ich auch das gleiche Problem zu haben. Es scheint, dass WinRT extrem faul ist, Bilder zu laden ... – satur9nine

Antwort

1

Da ich nicht die falsche Antwort angezeigt werden soll musste ich 10 andere Antwort hinzufügen Sekunden später ...

Beispiele:

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; 
} 

// Oder die System.Net.WebRequest() GetResponse() verwenden GetResponseStream()

.. 0
+0

Ich fügte eine Antwort hinzu, die ich erkannte, war falsch, also schrieb ich einfach, dass ich es reparieren würde, dieses Beispiel funktioniert und nicht das frühere. – Deukalion

+0

Hey vielen Dank für die Antwort, aber leider funktioniert das nur für die WPF App und nicht WInRT App. Das BitmapImage, auf das verwiesen wird, befindet sich in "System.Windows.Media.Imaging", aber für WinRT-Apps befindet sich BitmapImage in "Windows.UI.Xaml.Media.Imaging". Und alle Eigenschaften wie StreamSource usw. sind in der WinRT-Version – Bitsian

+0

nicht verfügbar. Sie können auf diesen Link für alle in WinRT http://msdn.microsoft.com/library/windows/apps/BR243235 verfügbaren Eigenschaften verweisen – Bitsian

0

Falls Sie System.Drawing Namespace verwenden, ist es einfacher, ein Bild aus einem Stream zu initiieren:

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 
} 
Verwandte Themen