Bạn có thể sử dụng một MemoryStream
nhưng thực sự lãng phí bộ nhớ vì hai bản sao riêng biệt của dữ liệu bitmap được lưu trong RAM: Khi bạn tải MemoryStream
, bạn tạo một bản sao và khi bitmap được giải mã một bản sao khác được thực hiện. Một vấn đề khác khi sử dụng MemoryStream
theo cách này là bạn bỏ qua bộ nhớ cache.
Cách tốt nhất để làm điều này là để đọc trực tiếp từ tập tin sử dụng 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 };
Giải pháp này là hiệu quả và đơn giản quá.
Lưu ý: Nếu bạn thực sự muốn bỏ qua bộ nhớ cache, ví dụ vì hình ảnh có thể thay đổi trên đĩa, bạn cũng nên đặt CreateOption = BitmapCreateOption.IgnoreImageCache
. Nhưng ngay cả trong trường hợp đó giải pháp này tốt hơn giải pháp MemoryStream
vì nó không giữ hai bản sao của dữ liệu hình ảnh trong RAM.
Nguồn
2010-03-11 10:27:23
Tx, nó hoạt động. Đối với người đọc sau này: Tôi đã sao chép nó vào một bộ nhớ như thế này: MemoryStream byteStream = new MemoryStream (File.ReadAllBytes (path)); – Peter
Có nó hoạt động, ** nhưng nó không hiệu quả ** vì: 1. Hai bản sao của dữ liệu hình ảnh được lưu giữ mãi mãi, và 2. Bộ nhớ đệm bị bỏ qua để hình ảnh được tải ngay cả khi nó đã có trong RAM. Bài viết được liên kết giải thích cách giải quyết cho # 1 nhưng nó đòi hỏi nhiều mã bổ sung và vẫn không giải quyết đượC# 2. Một giải pháp tốt hơn là 'BitmapCacheOption.OnLoad' được kết hợp với' BeginInit/EndInit'. –
Bạn không thể đóng luồng bộ nhớ sau 'EndInit'? Tại sao bạn cần phải giữ cả hai? – Jordan