Класс StorageFile предоставляет нам метод, называемый GetThumbnailAsync с помощью которого мы можем получить миниатюру файла в Windows (phone) 8.1 и UWP приложении.

Этот метод работает только для файлов, расположенных в публичных директориях вашего устройства. И не работает для файлов, расположеных в контейнере с данными приложения или локальном хранилище приложения.

Поэтому данный метод, будет полезен, когда вам нужно извлечь все видео файлы, которые хранятся в галерее телефона или вы работаете с видео, полученным из метода FileOpenPicker.

Код для получения миниатюры видео файла выглядит так:

public async Task<BitmapImage> FetchThumbnail(StorageFile videofile)
{
	var thumbnail = await videofile.GetThumbnailAsync(ThumbnailMode.VideosView);

	var inputBuffer = new Windows.Storage.Streams.Buffer(2048);

	IBuffer buf;
	IRandomAccessStream stream=new InMemoryRandomAccessStream();

	while ((buf = (await thumbnail.ReadAsync(inputBuffer, inputBuffer.Capacity, InputStreamOptions.None))).Length > 0) {
		await stream.WriteAsync(buf);
	}

	var image = new BitmapImage();
	image.SetSource(stream);

	return image;
}

Если вам нужно сохранить миниатюру в локальном хранилище вашего приложения вы можете использовать код, указанный ниже:

public async void SaveThumbnail(StorageFile videofile, string thumbnailfilename)
{
	var thumbnail = await videofile.GetThumbnailAsync(ThumbnailMode.VideosView);

	var saveFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(thumbnailfilename, CreationCollisionOption.GenerateUniqueName);
	var inputBuffer = new Windows.Storage.Streams.Buffer(2048);

	using (var destFileStream = await saveFile.OpenAsync(FileAccessMode.ReadWrite))
	{
		IBuffer buf;
		while ((buf = (await thumbnail.ReadAsync(inputBuffer, inputBuffer.Capacity, InputStreamOptions.None))).Length > 0) {
			await destFileStream.WriteAsync(buf);
		}
	}
}

Я надеюсь этот пост будет полезным для вас.

Оригинал

Теги: c#, uwp, сниппет, перевод

Редактировать