相信大家还在假期中,但是小弟遇到了莫名奇妙的问题,还请各位师兄师姐指教下:
如题,我在读取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
如题,我在读取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
用WinHex看下图片的位置,以及你程序算出的偏移量,两者的不同,调试下。
另外,ID3里的图片不止JPG,还可以有PNG。
ID3的网站里很好的解释了如何解析ID3的Tag Frame,不妨先看看Developer Information,了解下开发相关的事项。