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