Файл, у которого нет миниатюрного изображения, создает исключение COM в Win 8 Metro - PullRequest
2 голосов
/ 02 марта 2012

В моем приложении мне нужно извлечь миниатюрное изображение из файлов, выбранных с помощью средства выбора файлов.В следующей строке выдается исключение COM, когда средство выбора файлов возвращает файл, в котором отсутствует эскиз, например пустой файл * .bmp.Как мне избежать этого?

 StorageItemThumbnail t = await f.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.DocumentsView);

РЕДАКТИРОВАТЬ: дополнительные сведения и я имел в виду .bmp not .png извините ...

Воспроизвести:

  1. Rightщелкните в любом каталоге в режиме рабочего стола Metro, в контекстном меню выберите New-> Bitmap Image
  2. . В тестовой программе запустите File Picker, а затем вызовите GetThumbnailAsync для возвращенного файла;Вы получаете исключение ниже.

Сведения об исключении:

System.Runtime.InteropServices.COMException не было обработано кодом пользователя

HResult = -2147467259
Сообщение = Ошибка HRESULT E_FAIL был возвращен после вызова компонента COM.
Source = mscorlib
ErrorCode = -2147467259 StackTrace: at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в системе.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Runtime.CompilerServices.TaskAwaiter`1.GetResult () --- некоторые вещи пропущены ---
InnerException: null

* 1025 Кодзапустить средство выбора файлов:
public static async Task<IReadOnlyList<StorageFile>> PickMulipleFilesAsync()
    {
        FileOpenPicker picker = new FileOpenPicker();
        picker.SuggestedStartLocation = PickerLocationId.Desktop;
        picker.FileTypeFilter.Add("*");
        var files = await picker.PickMultipleFilesAsync();

        return files;
    }

1 Ответ

1 голос
/ 14 марта 2012

Как уже упоминалось в комментариях выше, а также кем-то на форумах MSDN. Обходной путь - это просто вызов GetThumbnailAsync в блоке try-catch и помещение изображения-заполнителя, когда миниатюра отсутствует.

StorageItemThumbnail t=null;
BitmapImage thumbnailImage= new BitmapImage();//image used for display
try{    
    t = await f.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.DocumentsView);
}
catch(Exception e){
    t = null;
}
if (null == t)
    thumbnailImage = placeholder;//no thumbnail then use the placeholder image
else 
    thumbnailImage.SetSource(t);
...