关于MP3 文件读取ID3v2专辑图片

Yale_Yange 2013-02-15 02:00:16
相信大家还在假期中,但是小弟遇到了莫名奇妙的问题,还请各位师兄师姐指教下:
如题,我在读取MP3文件的专辑图片的时候遇到了麻烦,读取出来的图片不是有损坏不能打开就是图片有一部分被莫名其妙的灰色所覆盖
我的代码是这样的:
public static void GetMediaItemImage(string path)
{
try
{
FileStream fs = new FileStream(path, FileMode.Open);
byte[] header = new byte[10]; //标签头
fs.Read(header, 0, 10);
string head = Encoding.Default.GetString(header, 0, 3);
if (head.Equals("ID3"))
{
int sizeAll = header[6] * 0x200000 //获取该标签的尺寸,不包括标签头
+ header[7] * 0x4000
+ header[8] * 0x20
+ header[9];
int size = 0;
byte[] body = new byte[10]; //数据帧头
fs.Read(body, 0, 10);
head = Encoding.Default.GetString(body, 0, 4);
while (!("APIC".Equals(head)))
{
size = body[size + 4] * 0x200000 //获取该数据帧的尺寸(不包括帧头)
+ body[size + 5] * 0x4000
+ body[size + 6] * 0x20
+ body[size + 7];
body = new byte[size + 10];
fs.Read(body, 0, size + 10);
head = Encoding.Default.GetString(body, size, 4);
}
size = body[size + 4] * 0x200000
+ body[size + 5] * 0x4000
+ body[size + 6] * 0x20
+ body[size + 7];
byte[] temp = new byte[4];
fs.Read(temp, 0, 4);
string tmp = Encoding.Default.GetString(temp);
while (!("JFIF".Equals(tmp)))
{
fs.Seek(-3, SeekOrigin.Current);
fs.Read(temp, 0, 4);
tmp = Encoding.Default.GetString(temp);
}
fs.Seek(-10, SeekOrigin.Current);
byte[] image = new byte[size];
fs.Read(image, 0, size);
MemoryStream ms = new MemoryStream(image);
Image pic = Image.FromStream(ms);
FileStream save = new FileStream(@"D:\1.png", FileMode.Create);
pic.Save(save, System.Drawing.Imaging.ImageFormat.Png);
}
else { }
}
catch { }
}
分不多,求大家帮帮忙~
...全文
466 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhxuhang 2013-10-23
  • 打赏
  • 举报
回复
最后问题解决了没有,我也遇到了这样的问题
Yale_Yange 2013-02-16
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
代码就不看了,出现这种问题是因为你读取图片数据不完整。 用WinHex看下图片的位置,以及你程序算出的偏移量,两者的不同,调试下。
谢谢您的帮忙,只是情况是偏移量是正确的,也就是说图片在MP3文件中的位置是找对的,可能是没有读全,我再多试几首歌看看
Yale_Yange 2013-02-16
  • 打赏
  • 举报
回复
引用 6 楼 dream238 的回复:
应该是解析APIC Frame的时候不正确,可以参考下标准的规范:http://id3.org/id3v2.4.0-frames 另外,ID3里的图片不止JPG,还可以有PNG。 ID3的网站里很好的解释了如何解析ID3的Tag Frame,不妨先看看Developer Information,了解下开发相关的事项。
谢谢您,网站我记下了,可能是计算APIC Frame的时候size计算错了
ArcRain 2013-02-16
  • 打赏
  • 举报
回复
应该是解析APIC Frame的时候不正确,可以参考下标准的规范:http://id3.org/id3v2.4.0-frames 另外,ID3里的图片不止JPG,还可以有PNG。 ID3的网站里很好的解释了如何解析ID3的Tag Frame,不妨先看看Developer Information,了解下开发相关的事项。
Yale_Yange 2013-02-16
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
代码就不看了,出现这种问题是因为你读取图片数据不完整。 用WinHex看下图片的位置,以及你程序算出的偏移量,两者的不同,调试下。
真心感谢,果然是数据没有读全的原因,可是我有一个疑惑,那就是我通过读取该数据帧头的第5~8个字节来获取这张图片的大小,明明要比真实的图片在MP3文件中的存储量小很多,这是为什么,难道ID3v2规范中存放图片的数据帧的size的计算方法改了?
threenewbee 2013-02-15
  • 打赏
  • 举报
回复
代码就不看了,出现这种问题是因为你读取图片数据不完整。 用WinHex看下图片的位置,以及你程序算出的偏移量,两者的不同,调试下。
Yale_Yange 2013-02-15
  • 打赏
  • 举报
回复
大过年的,人果然不多,先自己帮顶下~

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧