C# 调整ID3标签图片的大小

C# 调整ID3标签图片的大小,c#,wpf,id3,taglib-sharp,C#,Wpf,Id3,Taglib Sharp,您好,我正在制作一个小应用程序,它将加载一些.mp3歌曲并将其封面大小调整为所需的字节大小。 我认为最好的办法是改变真实的分辨率,直到它不低于要求。但我真的不知道如何保存它或如何保存ID3图片。 歌曲从OpenFileDialog加载,所需大小从简单文本框加载。 我正在使用taglib#和C#(WPF),但如果有更好的库来解决这个问题,我不会拒绝 这是我的例子,它确实调整了图片的大小,但它缩短了图片。 private void MenuItem_Click(object sender, Rout

您好,我正在制作一个小应用程序,它将加载一些.mp3歌曲并将其封面大小调整为所需的字节大小。
我认为最好的办法是改变真实的分辨率,直到它不低于要求。但我真的不知道如何保存它或如何保存ID3图片。

歌曲从OpenFileDialog加载,所需大小从简单文本框加载。
我正在使用taglib#和C#(WPF),但如果有更好的库来解决这个问题,我不会拒绝

这是我的例子,它确实调整了图片的大小,但它缩短了图片。

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
            int size;
            try
            {                
                size = int.Parse(textBox1.Text);
            }
            catch (FormatException)
            {
                MessageBox.Show("Enter requiered size!", "Err");
                return;
            }

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();         
            dlg.DefaultExt = ".mp3";
            dlg.Filter = "mp3 files (.mp3) | *.mp3";
            dlg.Multiselect = true;

            Nullable<bool> result = dlg.ShowDialog();            

            if (result == true)
            {
                foreach (string file in dlg.FileNames)
                {
                    var song = TagLib.File.Create(file);
                    if (song.Tag.Pictures.Length > 0)
                    {
                        // var bin = (byte[])(song.Tag.Pictures[0].Data.Data);                                                
                        song.Tag.Pictures[0].Data.Resize(size);
                    }
                }
            }            
}
private void MenuItem\u单击(对象发送方、路由目标方)
{
整数大小;
尝试
{                
size=int.Parse(textBox1.Text);
}
捕获(格式化异常)
{
Show(“输入所需大小!”,“Err”);
返回;
}
Microsoft.Win32.OpenFileDialog dlg=新的Microsoft.Win32.OpenFileDialog();
dlg.DefaultExt=“.mp3”;
dlg.Filter=“mp3文件(.mp3)|*.mp3”;
dlg.Multiselect=true;
可为空的结果=dlg.ShowDialog();
如果(结果==真)
{
foreach(dlg.filename中的字符串文件)
{
var song=TagLib.File.Create(文件);
如果(song.Tag.Pictures.Length>0)
{
//var bin=(字节[])(song.Tag.Pictures[0].Data.Data);
song.Tag.Pictures[0].Data.Resize(大小);
}
}
}            
}

数据属性是表示原始图像文件的
数组列表。通过切掉最后的字节来减小大小就像通过删除最后一半来缩小MP3或将一本书切成两半。您需要获取图像数据,将其转换为图像表示(例如,
System.Drawing.image
),缩放该图像,将其转换为字节数组,并将其存储回picture属性。它看起来像:

MemoryStream inputStream = new MemoryStream(song.Tag.Pictures[0].Data.Data);
Image picture = Image.FromStream(inputStream);
// Scale the image: http://www.codeproject.com/Articles/2941/Resizing-a-Photographic-image-with-GDI-for-NET
MemoryStream ouputStream = new MemoryStream();
picture.Save(outputStream, imageFormat);
song.Tag.Pictures[0].Data = outputStream.ToArray();

您必须在如何调整图像大小、如何选择输出格式等方面做一些工作。

我知道如何使用WinForms,但我希望您理解WinForms不是我正在使用的WPF。WPF image没有像Save()或FromStream()这样的方法。如果您真的需要WPF用于此部分,请参阅以下示例: