62,046
社区成员
发帖
与我相关
我的任务
分享
//文件大小偏移
int filesizeOffset = 0x0002;
//数据区偏移
int dataOffset = 0x000A;
//图像宽度偏移
int widthOffset = 0x0012;
//图像高度偏移
int heightOffset = 0x0016;
//位数偏移
int bitOffset = 0x001C;
//是否压缩偏移
int compressOffset = 0x001E;
//数据区大小偏移
int datasizeOffset = 0x0022;
int width = 0;
int height = 0;
int fileheadsize = 0;
int dataseize = 0;
int offset = 0;
//读取待切分文件
string file = "c:\\1.bmp";
FileInfo fi = new FileInfo(file);
FileStream fs = fi.OpenRead();
byte[] buff = new byte[4];
//数据区偏移量
fs.Seek(dataOffset, SeekOrigin.Begin);
int nBytesRead = fs.Read(buff, 0, buff.Length);
fileheadsize = BitConverter.ToInt32(buff, 0);
Console.WriteLine("数据区偏移:"+fileheadsize);
//宽度
fs.Seek(widthOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
width = BitConverter.ToInt32(buff, 0);
Console.WriteLine("宽度:" + width);
//高度
fs.Seek(heightOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
height = BitConverter.ToInt32(buff, 0);
Console.WriteLine("高度:" + height);
//位数
fs.Seek(bitOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
offset = BitConverter.ToInt32(buff, 0);
Console.WriteLine("位数:"+offset);
//是否压缩
fs.Seek(compressOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
offset = BitConverter.ToInt32(buff, 0);
Console.WriteLine("压缩:" + offset);
//数据区大小
fs.Seek(datasizeOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
dataseize = BitConverter.ToInt32(buff, 0);
Console.WriteLine("数据区大小:" + dataseize);
//读取图像下半部分,写入11.bmp
FileStream fs1 = new FileStream("c:\\11.bmp",FileMode.OpenOrCreate);
//复制文件头
fs.Seek(0,SeekOrigin.Begin);
byte[] filehead = new byte[fileheadsize];
fs.Read(filehead, 0, fileheadsize);
fs1.Write(filehead, 0, fileheadsize);
//复制数据
byte[] data = new byte[dataseize/2];
fs.Seek(fileheadsize, SeekOrigin.Begin);
fs.Read(data, 0, data.Length);
fs1.Write(data, 0, data.Length);
//修改高度,因为是水平切分,所以不需修改宽度
byte[] b = new byte[4];
b = BitConverter.GetBytes(height/2);
fs1.Seek(heightOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//修改数据区大小
b = new byte[4];
b = BitConverter.GetBytes(dataseize/ 2);
fs1.Seek(datasizeOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//修改文件大小
b = new byte[4];
b = BitConverter.GetBytes(fs1.Length);
fs1.Seek(filesizeOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//关闭对象
fs.Close();
fs1.Flush();
fs1.Close();
Console.Read();