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