在 windows 运行时将文件缩略图另存为图像
Save File Thumbnail as image in windows runtime
我想获取存储在 Videos 文件夹中的文件的缩略图,并将它们作为图像保存在我的本地文件夹中。
这是我获取文件的代码。
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 中的第一个文件创建的(或已经存在)。而不是那个,create/open 文件夹在 foreach 之外,
- 也用
file.Name
创建图像不是一个好主意,因此这些是视频,它们的扩展名可能是 mp4/mpg/other 而不是 jpg/png/other,
- 记得在packageappx.manifest文件中添加capabilities。
我认为下面的代码应该可以完成工作:
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);
}
}
我想获取存储在 Videos 文件夹中的文件的缩略图,并将它们作为图像保存在我的本地文件夹中。 这是我获取文件的代码。
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 中的第一个文件创建的(或已经存在)。而不是那个,create/open 文件夹在 foreach 之外,
- 也用
file.Name
创建图像不是一个好主意,因此这些是视频,它们的扩展名可能是 mp4/mpg/other 而不是 jpg/png/other, - 记得在packageappx.manifest文件中添加capabilities。
我认为下面的代码应该可以完成工作:
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);
}
}