UWP 更改存储文件的缩略图
UWP change thumbnail of a StorageFile
我依靠单击按钮来更改 StorageFile
的缩略图。 (这是一个音乐文件。)
我想通过从本地选择一个图像文件来实现。
private async void ChangeAlbumArtButton_Click(object sender, RoutedEventArgs e)
{
var music_file = await CurrentMusic.GetStorageFileAsync();
using (var dst = await music_file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.MusicView, 1024))
{
if (!dst.CanWrite)
{
MainPage.Instance.ShowNotification(Helper.LocalizeMessage("UnableToChangeAlbumArt"));
return;
}
FileOpenPicker picker = new FileOpenPicker
{
SuggestedStartLocation = PickerLocationId.PicturesLibrary
};
foreach (var item in new string[] { ".jpg", ".png", ".jpeg" })
picker.FileTypeFilter.Add(item);
var file = await picker.PickSingleFileAsync();
if (file == null) return;
using (var src_stream = await file.OpenReadAsync())
{
await dst.WriteAsync(await FileIO.ReadBufferAsync(file));
var src = new BitmapImage();
src.SetSource(src_stream);
AlbumArt.Source = src;
}
}
}
然而,dst.CanWrite
是错误的。应该如何更改缩略图?
如果您打算更改文件的缩略图,这不是通过代码编写流的方法。
缩略图的提供程序是打开文件的默认应用程序。例如,打开音乐文件的默认应用程序是Groove Music
,您看到的缩略图是由Groove Music
提供的。
如果您打算修改音乐文件的缩略图,
首先可以参考这个document设置文件关联协议,将音乐文件添加到关联列表,提供图片文件。
然后将您的应用设置为打开音乐文件的默认应用。
如果您不打算建立文件类型关联。有一个简单的方法,可以用图片文件代替GetThumbnailAsync()
的方法,就是不获取缩略图,直接在UI.
上显示选中的图片
此致。
您可以通过两种方式直接从系统驱动器访问文件。
1.StorageItemAccessList
如果您的所有文件都在一个文件夹中,您可以使用 StorageItemAccessList
获取 用户选择 的文件夹,您可以随时访问它你要
您可以查看 Microsoft 文档中的示例 here
2.BroadFileSystemAccess
如果您需要完全访问所有文件夹,那么您需要 BroadFileSystemAccess
。它的受限功能可帮助您从任何地方访问文件。
看看吧here
我使用名为 TagLib 的第三方库来解决我的问题:
using (var tagFile = TagLib.File.Create(new MusicFileAbstraction(await CurrentMusic.GetStorageFileAsync()), ReadStyle.Average))
{
FileOpenPicker picker = new FileOpenPicker
{
SuggestedStartLocation = PickerLocationId.PicturesLibrary
};
foreach (var item in new string[] { ".jpg", ".png", ".jpeg", ".mp3" })
picker.FileTypeFilter.Add(item);
var file = await picker.PickSingleFileAsync();
if (file == null) return;
if (FolderTree.IsMusicFile(file))
{
using (var source = TagLib.File.Create(new MusicFileAbstraction(file), ReadStyle.Average))
{
if (source.Tag.Pictures.Length == 0)
{
MainPage.Instance.ShowNotification(Helper.LocalizeMessage("MusicNoAlbumArt", file.DisplayName));
return;
}
tagFile.Tag.Pictures = source.Tag.Pictures;
}
}
else
{
tagFile.Tag.Pictures = new Picture[] { new Picture(new MusicFileAbstraction(file)) { Type = PictureType.BackCover } };
}
AlbumArt.Source = await BytesToBitmapImage(tagFile.Tag.Pictures[0].Data.ToArray());
AlbumArt.Visibility = Visibility.Visible;
tagFile.Save();
}
我基本上允许用户从本地打开图像文件或从音乐文件复制专辑封面。然后创建一个图片对象或从音乐文件中读取那些专辑封面,然后将其分配给目标音乐文件。
注意 MusicFileAbstraction
的使用。否则你将得到 UnauthorizedAccessException
。可以找到源代码 here.
可以找到更多源代码here。
我依靠单击按钮来更改 StorageFile
的缩略图。 (这是一个音乐文件。)
我想通过从本地选择一个图像文件来实现。
private async void ChangeAlbumArtButton_Click(object sender, RoutedEventArgs e)
{
var music_file = await CurrentMusic.GetStorageFileAsync();
using (var dst = await music_file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.MusicView, 1024))
{
if (!dst.CanWrite)
{
MainPage.Instance.ShowNotification(Helper.LocalizeMessage("UnableToChangeAlbumArt"));
return;
}
FileOpenPicker picker = new FileOpenPicker
{
SuggestedStartLocation = PickerLocationId.PicturesLibrary
};
foreach (var item in new string[] { ".jpg", ".png", ".jpeg" })
picker.FileTypeFilter.Add(item);
var file = await picker.PickSingleFileAsync();
if (file == null) return;
using (var src_stream = await file.OpenReadAsync())
{
await dst.WriteAsync(await FileIO.ReadBufferAsync(file));
var src = new BitmapImage();
src.SetSource(src_stream);
AlbumArt.Source = src;
}
}
}
然而,dst.CanWrite
是错误的。应该如何更改缩略图?
如果您打算更改文件的缩略图,这不是通过代码编写流的方法。
缩略图的提供程序是打开文件的默认应用程序。例如,打开音乐文件的默认应用程序是Groove Music
,您看到的缩略图是由Groove Music
提供的。
如果您打算修改音乐文件的缩略图,
首先可以参考这个document设置文件关联协议,将音乐文件添加到关联列表,提供图片文件。
然后将您的应用设置为打开音乐文件的默认应用。
如果您不打算建立文件类型关联。有一个简单的方法,可以用图片文件代替GetThumbnailAsync()
的方法,就是不获取缩略图,直接在UI.
此致。
您可以通过两种方式直接从系统驱动器访问文件。
1.StorageItemAccessList
如果您的所有文件都在一个文件夹中,您可以使用 StorageItemAccessList
获取 用户选择 的文件夹,您可以随时访问它你要
您可以查看 Microsoft 文档中的示例 here
2.BroadFileSystemAccess
如果您需要完全访问所有文件夹,那么您需要 BroadFileSystemAccess
。它的受限功能可帮助您从任何地方访问文件。
看看吧here
我使用名为 TagLib 的第三方库来解决我的问题:
using (var tagFile = TagLib.File.Create(new MusicFileAbstraction(await CurrentMusic.GetStorageFileAsync()), ReadStyle.Average))
{
FileOpenPicker picker = new FileOpenPicker
{
SuggestedStartLocation = PickerLocationId.PicturesLibrary
};
foreach (var item in new string[] { ".jpg", ".png", ".jpeg", ".mp3" })
picker.FileTypeFilter.Add(item);
var file = await picker.PickSingleFileAsync();
if (file == null) return;
if (FolderTree.IsMusicFile(file))
{
using (var source = TagLib.File.Create(new MusicFileAbstraction(file), ReadStyle.Average))
{
if (source.Tag.Pictures.Length == 0)
{
MainPage.Instance.ShowNotification(Helper.LocalizeMessage("MusicNoAlbumArt", file.DisplayName));
return;
}
tagFile.Tag.Pictures = source.Tag.Pictures;
}
}
else
{
tagFile.Tag.Pictures = new Picture[] { new Picture(new MusicFileAbstraction(file)) { Type = PictureType.BackCover } };
}
AlbumArt.Source = await BytesToBitmapImage(tagFile.Tag.Pictures[0].Data.ToArray());
AlbumArt.Visibility = Visibility.Visible;
tagFile.Save();
}
我基本上允许用户从本地打开图像文件或从音乐文件复制专辑封面。然后创建一个图片对象或从音乐文件中读取那些专辑封面,然后将其分配给目标音乐文件。
注意 MusicFileAbstraction
的使用。否则你将得到 UnauthorizedAccessException
。可以找到源代码 here.
可以找到更多源代码here。