C# TagLib如何为Mp3设置专辑封面?

4

我有一个mp3文件,想要添加专辑封面。这个封面已经保存在临时文件夹中,我已经检查过了,它是一个jpeg格式的图片。

这是我提供的代码:

        public void AddMp3Tags()
        {
            TagLib.File file = TagLib.File.Create(OutputPath + OutputName + "." + Format);
            SetAlbumArt(Art, file);
            file.Tag.Title = SongTitle;
            file.Tag.Performers = Artists.Split(',');
            file.Tag.Album = Album;           
            file.Tag.Track = (uint)TrackNumber;
            file.Tag.Year = (uint)Convert.ToInt32(Regex.Match(Year, @"(\d)(\d)(\d)(\d)").Value);            
            file.Save();
        }

        public void SetAlbumArt(string url, TagLib.File file)
        {     
            string path = string.Format(@"{0}temp\{1}.jpg", OutputPath, Guid.NewGuid().ToString());
            using (WebClient client = new WebClient())
            {

                client.DownloadFile(new Uri(url), path);
            }


            TagLib.Picture pic = new TagLib.Picture
            {
                Type = TagLib.PictureType.FrontCover,
                Description = "Cover",
                MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg
            };
            MemoryStream ms = new MemoryStream();
            Image image = Image.FromFile(path);
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Position = 0;
            pic.Data = TagLib.ByteVector.FromStream(ms);
            file.Tag.Pictures = new TagLib.IPicture[] { pic };
            file.Save();
            ms.Close();

        }

除了艺术品,所有标签都设置正确,艺术品只显示一个黑色方框: Windows Media Player中的黑色方框封面艺术品。 我试过很多方法,我做错了什么?

1
只是一个注意事项,在这里不是问题。 可能没有理由将JPEG读入图像并再次保存,因为它会导致质量损失。 只需打开文件并将该流传递给TagLib即可。 - Sami Kuhmonen
2个回答

5
所以我进行了更多的研究,发现默认情况下WMP尝试使用Web服务获取专辑艺术品。我在VLC中打开了这首歌曲,显示了艺术作品。专辑代码正确地编写如此: Mp3Tag Viewer/Editor 我发现我的标签使用的是Id3v2.4和Id3v1。由于某种原因,WMP不喜欢这个,所以我强制TagLib使用Id3v2.3。我还将文本编码更改为UFT16,因为UFT8不起作用。专辑封面现在在WMP和Windows资源管理器中显示。
我还找到了一种方法,可以通过从网页下载数据并将其保存到内存中来避免将图像写入磁盘。
这是我的最终代码:
public void AddMp3Tags()
{
    TagLib.Id3v2.Tag.DefaultVersion = 3;
    TagLib.Id3v2.Tag.ForceDefaultVersion = true;
    TagLib.File file = TagLib.File.Create(OutputPath + OutputName + ".mp3");
    SetAlbumArt(Art, file);
    file.Tag.Title = SongTitle;
    file.Tag.Performers = Artists.Split(',');
    file.Tag.Album = Album;           
    file.Tag.Track = (uint)TrackNumber;
    file.Tag.Year = (uint)Convert.ToInt32(Regex.Match(Year, @"(\d)(\d)(\d)(\d)").Value);
    file.RemoveTags(file.TagTypes & ~file.TagTypesOnDisk);
    file.Save();
}

public void SetAlbumArt(string url, TagLib.File file)
{            
    string path = string.Format(@"{0}temp\{1}.jpg", OutputPath, Guid.NewGuid().ToString());
    byte[] imageBytes;
    using (WebClient client = new WebClient())
    {
        imageBytes = client.DownloadData(url);
    }

    TagLib.Id3v2.AttachedPictureFrame cover = new TagLib.Id3v2.AttachedPictureFrame
    {
        Type = TagLib.PictureType.FrontCover,
        Description = "Cover",
        MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg,
        Data = imageBytes,
        TextEncoding = TagLib.StringType.UTF16


    };
    file.Tag.Pictures = new TagLib.IPicture[] { cover };
}

我希望这能帮到和我有同样问题的人,不需要像我一样花费大量时间去解决这个问题。

不确定为什么你需要那么多代码。我只添加了一行图片,它在WMP和VLC中都可以正常工作(而且没有更改标签版本)>>>>> file.Tag.Pictures = new TagLib.IPicture[] { new TagLib.Picture(@"c:\temp\mycover.png") }; - Vijay Jagdale

2
请确保您的文件已成功下载,然后尝试以下操作:
public void SetAlbumArt(string url, TagLib.File file)
{     
    string path = string.Format(@"{0}temp\{1}.jpg", OutputPath, Guid.NewGuid().ToString());
    using (WebClient client = new WebClient())
    {

        client.DownloadFile(new Uri(url), path);
    }

    file.Tag.Pictures = new TagLib.IPicture[]
    {
        new TagLib.Picture(new TagLib.ByteVector((byte[])new System.Drawing.ImageConverter().ConvertTo(System.Drawing.Image.FromFile(path), typeof(byte[]))))
        {
            Type = TagLib.PictureType.FrontCover,
            Description = "Cover",
            MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg
        }
    };

    file.Save();
}

不幸的是,这仍然没有起作用,而且图像文件肯定已经下载了,因为我可以在文件夹中看到它。 - Laurence Rawlings
确保 JPEG 文件格式正确。可能是带有“.jpg”扩展名的位图图像。使用画图打开您的 JPEG 文件,并另存为不同名称(进行测试)。 - Hossein Golshani
这不是问题所在。但无论如何还是谢谢。我现在已经解决了我的问题。 - Laurence Rawlings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接