2017-04-18 20 views
-2

我嘗試使用LibTiff.Net庫讀取和寫入1.5 GB平鋪Tiff文件,因爲它宣稱支持BigTiff(> 4 GB)圖像文件。我編寫了下面的代碼,但在「buffer [tiles] ...」行中出現錯誤,導致內存異常。我希望能夠幫助我解決這個問題的開發人員。使用LibTiff.Net讀取1.5 GB基於tile的Tiff文件時出現內存不足異常

using (Tiff input = Tiff.Open(@"E:\active folder\Sample_04.tif", "r")) 
     { 
      int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
      int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
      int tileWidth = input.GetField(TiffTag.TILEWIDTH)[0].ToInt(); 
      int tileLentgh = input.GetField(TiffTag.TILELENGTH)[0].ToInt(); 

      int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt(); 
      int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt(); 
      int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt(); 

      int tiles = 0; 
      int tileSize = input.TileSize(); 
      byte[][] buffer = new byte[tileSize][]; 


      for (int y = 0; y < height; y += tileLentgh) 
      { 
       for (int x = 0; x < width; x += tileWidth) 
       { 
        buffer[tiles] = new byte[tileSize]; 
        input.ReadTile(buffer[tiles], 0, x, y, 0, 0); 
        tiles++; 
       } 
      } 

      // writing 
      using (Tiff output = Tiff.Open("output.tif", "w")) 
      { 

       output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel); 
       output.SetField(TiffTag.IMAGEWIDTH, width); 
       output.SetField(TiffTag.IMAGELENGTH, height); 
       output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample); 
       output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0)); 
       output.SetField(TiffTag.PHOTOMETRIC, photo); 
       output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); 

       int c = 0; 

       for (int y = 0; y < height; y += tileLentgh) 
       { 
        for (int x = 0; x < width; x += tileWidth) 
        { 
         output.WriteTile(buffer[c], x, y, 0, 0); 
         c++; 
        } 
       } 
      } 
     } 
     System.Diagnostics.Process.Start("output.tif"); 
    } 
+2

32或64位進程? – stuartd

+0

它是一個32位處理器。 –

+1

機器有多少內存?交換/頁面文件空間配置/可用多少?拋出異常時,進程佔用多少內存? – DarkSquirrel42

回答

1

問題不在於庫不支持BigTiff文件,當您嘗試分配巨大的數組時,會引發該錯誤。您編寫的代碼嘗試將數組分配到計算機的內存中,期望有足夠的空間來執行此操作,而且似乎沒有。

處理大小與目標系統上的可用內存相當的數據總是需要額外關注(這就是爲什麼您可以在庫的描述中看到強調BigTiff支持的原因)。

幸運的是,這不是一個新問題,並有解決方案:看到一些答案herehere

基本上,這些解決方案背後的想法是使用您的硬盤(或其他存儲設備)來存儲數據並提供一個接口,以便在需要時將必要部分交換到內存(就像virtual memory一樣)。

+0

謝謝,但我對我的代碼讀取平鋪Tiff存在疑問,因爲沒有使用readTile()方法讀取的示例代碼。我會採取你的建議來處理龐大的緩衝陣列。再次感謝! –

相關問題