2012-12-11 41 views
5

Tôi có rất nhiều hình ảnh trong thư mục tài sản của tôi về dự án mà tôi cần tải vào bộ nhớ khi bắt đầu ứng dụng. Cách tốt nhất để làm điều đó là giảm thời gian tải CPU.Cách tốt nhất để tải hình ảnh vào bộ nhớ?

tôi đang làm điều này:

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

Và sau đó tôi kết BitmapImage này với một điều khiển hình ảnh.

Nhưng tôi không chắc chắn liệu cài đặt UriSource có thực sự tải hình ảnh vào bộ nhớ hay không.

Tôi cũng thấy thuộc tính SetSourceAsync cho BitmapImage. Nhưng tôi không chắc chắn làm thế nào để sử dụng nó trong bối cảnh của tôi. bất cứ ai có thể vui lòng giúp tôi với một trong hai thuộc tính SetSourceAsync hoặc cách tốt nhất để tải các hình ảnh ....

Cảm ơn

+0

Tôi cũng có cùng một vấn đề. Có vẻ như WinRT cực kỳ lười biếng khi tải hình ảnh ... – satur9nine

Trả lời

1

Vì tôi không muốn câu trả lời sai sẽ được hiển thị tôi có thêm câu trả lời khác 10 giây sau ...

Ví dụ:

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

// Hoặc sử dụng() GetResponseStream System.Net.WebRequest() GetResponse()

.. 0
+0

Tôi đã thêm một câu trả lời mà tôi nhận ra là sai nên tôi chỉ viết rằng tôi sẽ sửa nó, ví dụ này hoạt động chứ không phải ví dụ trước đó. – Deukalion

+0

Hey cảm ơn cho câu trả lời, nhưng thật đáng buồn này chỉ hoạt động cho các ứng dụng WPF và không ứng dụng WInRT. BitmapImage u r đề cập đến trong "System.Windows.Media.Imaging" nhưng đối với các ứng dụng WinRT, BitmapImage nằm trong "Windows.UI.Xaml.Media.Imaging". Và tất cả các thuộc tính như StreamSource vv không có sẵn trong phiên bản WinRT – Bitsian

+0

Bạn có thể tham khảo liên kết này cho tất cả các thuộc tính có sẵn trong WinRT http://msdn.microsoft.com/library/windows/apps/BR243235 – Bitsian

0

Trong trường hợp bạn sử dụng System.Drawing namespace, nó dễ dàng hơn để bắt đầu một hình ảnh từ một dòng:

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 
} 
Các vấn đề liên quan