メモリの節約
<Image Width="200" Source="C:\hoge.jpg"/>
上のように書くと、フルサイズでファイルを読み込んでメモリ上に展開したまま表示される際に縮小化して表示される。つまりメモリにはフルサイズで乗る。
<Image Width="120">
<Image.Source>
<BitmapImage DecodePixelWidth="120" UriSource="C:\hoge.jpg" />
</Image.Source>
</Image>
DecodePixelWidthを指定すると、そのサイズでメモリ上に展開されるため、メモリの節約になる。
これをBindingするためにコードで書く場合、URIを文字列で渡してもよいが、BitmapImageを渡すこともできる。
Xaml
<Image Source="{Binding Image}"/>
ViewModel
this.Image = new BitmapImage();
this.Image.BeginInit();
this.Image.UriSource = new Uri(@"C:\hoge.jpg");
this.Image.DecodePixelWidth = 120;
this.Image.EndInit();
画像表示でファイルをロックさせない
さて、上記のようにImageを読み込ませると、画像ファイルがロックされる。
アイコンの表示程度あれば問題ないが、今回はサムネイル表示をしたいのです。
サムネイルで表示するという事は、当然そのファイルを操作することが前提であり、ロックされては困ります。
var image = = new BitmapImage();
FileStream stream = File.OpenRead(@"C:\hoge.jpg");
this.Image.BeginInit();
this.Image.CacheOption = BitmapCacheOption.OnLoad;
this.Image.StreamSource = stream;
this.Image.DecodePixelWidth = 120;
this.Image.EndInit();
stream.Close();
メモリリーク問題
現状困ってないので深入りせず。
こんな記事があったので記憶の片隅に。
コメント