如何在 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# 应用程序中设置专辑封面?的主要内容,如果未能解决你的问题,请参考以下文章