如何在 Win8 C# 应用程序中设置专辑封面?

Posted

技术标签:

【中文标题】如何在 Win8 C# 应用程序中设置专辑封面?【英文标题】:How can I set album artwork in a Win8 C# application? 【发布时间】:2013-04-16 05:31:02 【问题描述】:

我希望能够拍摄现有照片并将其设置为专辑插图。

我可以使用GetThumbnailAsync 给我一个缩略图和GetOutputStream 来获取缩略图输出流。不幸的是,它不可写。

如何在 Win8 C# 应用程序中的项目上设置专辑插图(或任何缩略图)?

当前(非工作)代码。当 outStream 被拒绝访问错误刷新时,它会死掉

    FileOpenPicker fileopenpicker = new FileOpenPicker();

    fileopenpicker.FileTypeFilter.Add(".jpg");
    fileopenpicker.FileTypeFilter.Add(".png");

    fileopenpicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;// | PickerLocationId.DocumentsLibrary | PickerLocationId.PicturesLibrary | PickerLocationId.MusicLibrary;

    var singlefileoperation = await fileopenpicker.PickSingleFileAsync();
    var read = await singlefileoperation.OpenAsync(FileAccessMode.Read);

    StorageFile replay = currentlyPlaying;
    TimeSpan pos = ME.Position;
    ME.Stop();

    //curren
    StorageItemThumbnail storageItemThumbnail = await currentlyPlaying.GetThumbnailAsync(ThumbnailMode.SingleItem);




    IOutputStream inputStreamAt = storageItemThumbnail.GetOutputStreamAt(0);
    Stream outStream = inputStreamAt.AsStreamForWrite();

    var inStreamAt = read.GetInputStreamAt(0);
    var inStream = inStreamAt.AsStreamForRead();
    await inStream.CopyToAsync(outStream);
    await outStream.FlushAsync();
    outStream.Dispose();
    inStream.Dispose();
    inStreamAt.Dispose();

【问题讨论】:

***.com/questions/12924390/… 显示当前播放曲目的现有专辑封面:未将专辑封面设置到文件本身中。 您正在使用一些代码?还是您遇到的具体错误? 您从哪里获得艺术品?本地还是在线?发布您正在处理的代码! 您的目标是哪种文件格式?对于 MP3,您必须使用 ID3-Tags,如 here 中所述 【参考方案1】:

TagLib Sharp 应该可以帮助您找到所需的内容。

TagLib.File tagFile = TagLib.File.Create(c:/yourpath/yoursong.mp3);
IPicture newArt = new Picture(c:/yourimagepath/youralbumart.jpg);
tagFile.Tag.Pictures = new IPicture[1] newArt;
tagFile.Save();

Code Source

编辑:更新 TagLib Sharp 库的链接

【讨论】:

绝对不是我想要的。具体来说,我反复指出这需要在 Win8 Metro 应用程序中工作,这意味着没有 TagLib Sharp。 啊,抱歉。我自己研究了一会儿。从外观上看,您最好的选择可能是调整或更新 TagLib Sharp 源代码中的代码。如您所见,他们必须手动将标签信息序列化并附加到文件二进制流中。 Windows Store API 没有这个功能并不奇怪,因为 Core .Net 库似乎也没有。从我对 TagLib Sharp 源的粗略扫描来看,它看起来可以适应更新的 API。然而,这将是一个项目。 是的,这看起来就像我必须走的路。在我重新设计了一些有用的东西后,我会重新回答。 你弄明白了吗?我可以调整库以允许我设置专辑封面。然而,taglib sharp 使用了大量 Windows 应用商店应用程序中不允许使用的 API。【参考方案2】:

刚刚发现了这个使 TagLib Sharp 与 Windows 8+ 应用程序兼容的 GitHub 项目TagLib Sharp Portable。您可以通过 NuGet 将其添加到您的项目中,尽管它仍然是预发布版本。

但是,目前使用包含的StreamFileAbstraction 类存在一个错误。 保存标签或专辑封面时有时会抛出***Exception。 使用自定义的 FileAbstraction 类,它对我很有用。

你可以像原来的TagLib一样使用它:

StorageFile file = [...]
TagLib.File tagFile = TagLib.File.Create(new FileAbstraction(file.Name, (await file.OpenAsync(FileAccessMode.ReadWrite)).AsStream()));

其余的和 JHixson 的回答一样。

自定义 FileAbstraction 类:

public class FileAbstraction : TagLib.File.IFileAbstraction

    public FileAbstraction(string name, Stream stream)
    
        this.Name = name;
        this.ReadStream = stream;
        this.WriteStream = stream;
    

    public void CloseStream(Stream stream)
    
        stream.Flush();
    

    public string Name
    
        get;
        private set;
    

    public Stream ReadStream
    
        get;
        private set;
    

    public Stream WriteStream
    
        get;
        private set;
    

【讨论】:

以上是关于如何在 Win8 C# 应用程序中设置专辑封面?的主要内容,如果未能解决你的问题,请参考以下文章

C# TagLib 为 Mp3 设置专辑封面

在 android 11 中接收专辑封面

在 TableViewCell 中设置默认图像

如何在音频文件中添加艺术品,以显示在专辑封面中?

如何使用 ffmpeg 添加专辑封面?

如何在 C# 中的控制台应用程序中设置鼠标光标的位置?