在Windows运行时将文件缩略图保存为图像

我想获得存储在“video”文件夹中的文件的缩略图,并将它们保存为本地文件夹中的图像。 这里是我的代码来获取文件。

var v = await KnownFolders.VideosLibrary.GetFilesAsync(); foreach (var file in v) { var thumb = await file.GetScaledImageAsThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem); BitmapImage Img = new BitmapImage(); Img.SetSource(thumb); await ApplicationData.Current.LocalFolder.CreateFolderAsync("VideoThumb"); var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync( "VideoThumb\\" + file.Name, CreationCollisionOption.FailIfExists); var fs = await imageFile.OpenAsync(FileAccessMode.ReadWrite); //I don't know how to save thumbnail on this file ! } 

我的项目是Windows Phone 8.1运行时C#应用程序。

有几件事你需要处理:

  • 你不需要BitmapImage ,因为缩略图提供了一个你可以直接写入文件的流,
  • 您在创建文件方法失败(文件存在)时没有处理这种情况,
  • 创建文件夹方法会在文件夹被创建(或已经存在)的时候抛出第一个文件在foreach中的异常。 而不是,在foreach之外创建/打开文件夹,
  • 也用file.Name创建图像不是一个好主意,因此那些视频和它们的扩展名可能是mp4 / mpg /其他不是jpg / png / other
  • 记得在packageappx.manifest文件中添加功能

我认为下面的代码应该做的工作:

 private async Task SaveViedoThumbnails() { IBuffer buf; StorageFolder videoFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("VideoThumb", CreationCollisionOption.OpenIfExists); Windows.Storage.Streams.Buffer inputBuffer = new Windows.Storage.Streams.Buffer(1024); var v = await KnownFolders.VideosLibrary.GetFilesAsync(); foreach (var file in v) { var thumb = await file.GetScaledImageAsThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem); var imageFile = await videoFolder.CreateFileAsync(file.DisplayName + ".jpg", CreationCollisionOption.ReplaceExisting); using (var destFileStream = await imageFile.OpenAsync(FileAccessMode.ReadWrite)) while ((buf = (await thumb.ReadAsync(inputBuffer, inputBuffer.Capacity, Windows.Storage.Streams.InputStreamOptions.None))).Length > 0) await destFileStream.WriteAsync(buf); } }