相信大家还在假期中,但是小弟遇到了莫名奇妙的问题,还请各位师兄师姐指教下:
如题,我在读取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 { } 
        }
分不多,求大家帮帮忙~image

解决方案 »

  1.   

    代码就不看了,出现这种问题是因为你读取图片数据不完整。
    用WinHex看下图片的位置,以及你程序算出的偏移量,两者的不同,调试下。
      

  2.   

    真心感谢,果然是数据没有读全的原因,可是我有一个疑惑,那就是我通过读取该数据帧头的第5~8个字节来获取这张图片的大小,明明要比真实的图片在MP3文件中的存储量小很多,这是为什么,难道ID3v2规范中存放图片的数据帧的size的计算方法改了?
      

  3.   

    应该是解析APIC Frame的时候不正确,可以参考下标准的规范:http://id3.org/id3v2.4.0-frames
    另外,ID3里的图片不止JPG,还可以有PNG。
    ID3的网站里很好的解释了如何解析ID3的Tag Frame,不妨先看看Developer Information,了解下开发相关的事项。
      

  4.   

    谢谢您,网站我记下了,可能是计算APIC Frame的时候size计算错了