問題 §
UWPのStorageFile.GetThumbnailAsyncメソッドで取得したサムネール画像をキャッシュすると2回目の利用で何も描画されない。
以下は問題が起きるコード例。i1とi2はXAMLのImage要素とする。
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file == null) return;
var thum = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem);
var bmi1 = new BitmapImage();
bmi1.SetSource(thum);
i1.Source = bmi1;
var bmi2 = new BitmapImage();
bmi2.SetSource(thum);
i2.Source = bmi2;
原因 §
StorageFile.GetThumbnailAsyncメソッドは実際には画像を返しているわけではなく、画像を得るための一種のストリーム的なものを返している。従って、一度最後まで読む出すと、2回目は既に最後まで読まれた後なので何も読み出せない。
解決 §
GetThumbnailAsyncメソッドから得られた値は1回しか使わない。
BitmapImageオブジェクトなら何回使っても良い。
以下は解決例。
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file == null) return;
var thum = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem);
var bmi1 = new BitmapImage();
bmi1.SetSource(thum);
i1.Source = bmi1;
i2.Source = bmi1;
感想 §
「特殊な変なテクニックと併用したので、気付くまで時間と手間を食ってしまった」
「なぜ気付くことができたの?」
「気分転換したからかな」
「やはり発想の転換が最重要なのだね」