2018年02月10日
川俣晶の縁側ソフトウェア技術雑記 total 2307 count

UWPのGetThumbnailAsyncで取得したサムネール画像をキャッシュすると2回目の利用で何も得られない

Written By: 川俣 晶連絡先

問題 §

 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;

感想 §

「特殊な変なテクニックと併用したので、気付くまで時間と手間を食ってしまった」

「なぜ気付くことができたの?」

「気分転換したからかな」

「やはり発想の転換が最重要なのだね」