C++ 文件流读取 图片


   //文件大小偏移
             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();
 
 
 
 
读取大文件
  private  void  ReadStreamFromFile()
         {
             string  filePath =  @"D:\abc.txt" ;
             int  bufferSize = 1024000;  //每次读取的字节数
             byte [] buffer =  new  byte [bufferSize];
             System.IO.FileStream stream =  null ;
             try
             {
                 stream =  new  System.IO.FileStream(filePath, System.IO.FileMode.Open);
                 long  fileLength = stream.Length; //文件流的长度
 
                 int  readCount = ( int )Math.Ceiling(( double )(bufferSize / fileLength));  //需要对文件读取的次数
                 int  tempCount = 0; //当前已经读取的次数
 
                 do
                 {
                     stream.Read(buffer, tempCount * bufferSize, bufferSize);  //分readCount次读取这个文件流,每次从上次读取的结束位置开始读取bufferSize个字节
                     //这里加入接收和处理数据的逻辑
                        tempCount++ 
                     //
                 }
                 while  (tempCount < readCount);
             }
             catch
             {
 
             }
             finally
             {
                 if  (stream !=  null )
                     stream.Dispose();
             }
         }
 
 
 
 
 
 
  using (var reader = new StreamReader(responseStream, encoding))
                {
                    //10k
                    var clen = 1024 * 10;
                    var read = new Char[clen];
                    var count = reader.Read(read, 0, clen);
                    while (count > 0)
                    {
                        var str = new string(read, 0, count);
                        rsb.Append(str);
                        count = reader.Read(read, 0, clen);
                    }
                    reader.Close();
                    reader.Dispose();
                    responseStream.Dispose();
                    responseStream.Close();
                    response.Close();
                }
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM