首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于MP3 资料读取ID3v2专辑图片

2013-02-24 
关于MP3 文件读取ID3v2专辑图片相信大家还在假期中,但是小弟遇到了莫名奇妙的问题,还请各位师兄师姐指教下

关于MP3 文件读取ID3v2专辑图片
相信大家还在假期中,但是小弟遇到了莫名奇妙的问题,还请各位师兄师姐指教下:
如题,我在读取MP3文件的专辑图片的时候遇到了麻烦,读取出来的图片不是有损坏不能打开就是图片有一部分被莫名其妙的灰色所覆盖关于MP3 资料读取ID3v2专辑图片
我的代码是这样的:
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 { } 
        }
分不多,求大家帮帮忙~ image
[解决办法]
代码就不看了,出现这种问题是因为你读取图片数据不完整。
用WinHex看下图片的位置,以及你程序算出的偏移量,两者的不同,调试下。
[解决办法]
应该是解析APIC Frame的时候不正确,可以参考下标准的规范:http://id3.org/id3v2.4.0-frames
另外,ID3里的图片不止JPG,还可以有PNG。
ID3的网站里很好的解释了如何解析ID3的Tag Frame,不妨先看看Developer Information,了解下开发相关的事项。

热点排行