【问题标题】:UWP change thumbnail of a StorageFileUWP 更改 StorageFile 的缩略图
【发布时间】:2019-11-14 08:48:12
【问题描述】:

我依靠单击按钮来更改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 是错误的。缩略图应该怎么改?

【问题讨论】:

    标签: uwp win-universal-app


    【解决方案1】:

    如果您打算更改文件的缩略图,这不是通过代码编写流的方式。

    缩略图的提供者是打开文件的默认应用程序。比如打开音乐文件的默认应用是Groove Music,你看到的缩略图是Groove Music提供的。

    如果您打算修改音乐文件的缩略图,

    • 首先,您可以参考这个document来设置文件关联协议,将音乐文件添加到关联列表中,并提供图像文件。

    • 然后将您的应用设置为打开音乐文件的默认应用。


    如果您不打算建立文件类型关联。有一个简单的方法,你可以使用图片文件代替GetThumbnailAsync()方法,即不获取缩略图,直接在UI上显示选中的图片。

    最好的问候。

    【讨论】:

    • 实际上 Groove 不提供缩略图。它是音乐文件的属性(注意我在参数中使用的Windows.Storage.FileProperties.ThumbnailMode.MusicView)。您可以从 qq 音乐等平台下载音乐文件。您可以看到它的缩略图被读取为专辑封面,而不是 Windows 中显示的凹槽图标。
    • 那么你要做的是修改音乐文件的专辑封面吗?
    • 我会说是的(因为缩略图恰好与专辑封面相同),我正在通过更改 StorageItemThumbnail 来做到这一点。不知道有没有别的办法改。
    • 我做了更多的实验,包括修改音乐文件的元数据,但没有奏效。目前 UWP 不提供修改音乐文件专辑封面的方法。您可以找到一些相关的第三方库。
    【解决方案2】:

    您可以通过两种方式直接从系统驱动器访问文件。

    1.StorageItemAccessList

    如果您的所有文件都将放在一个文件夹中,您可以使用StorageItemAccessList 获取用户选择的文件夹,您可以随时访问它

    您可以查看 Microsoft 文档 here 中的示例

    2.BroadFileSystemAccess

    如果您需要完全访问所有文件夹,则需要BroadFileSystemAccess。它的功能受限,可帮助您从任何地方访问文件。

    看看here

    【讨论】:

      【解决方案3】:

      我使用了一个名为 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();
      }
      

      我基本上允许用户从本地打开图像文件或从音乐文件复制专辑封面。然后创建一个 Picture 对象或从音乐文件中读取这些专辑封面,然后将其分配给目标音乐文件。

      注意MusicFileAbstraction 的使用。没有它你会得到UnauthorizedAccessException。源码可以在here找到。

      更多源码可以在here找到。

      【讨论】:

        猜你喜欢
        • 2017-10-20
        • 2012-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 2014-09-17
        相关资源
        最近更新 更多