2017-04-18 1 views
-2

BigTiff (> 4GB) 이미지를 지원한다고 선언 된대로 LibTiff.Net 라이브러리를 사용하여 1.5GB 타일링 TIFF 파일을 읽고 쓰려고했습니다. 파일. 나는 아래 코드를 썼지 만 "buffer [tiles] ..."라는 줄에 오류가 발생하여 메모리 예외가 발생합니다. 이 문제를 해결하는 데 도움을 줄 수있는 개발자에게 감사드립니다.LibTiff.Net을 사용하여 1.5GB 타일 기반 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 지원이 강조되는 이유가 여기에 나와 있습니다).

다행히도 이것은 새로운 문제는 아니며 이에 대한 해결책이 있습니다. 답변 : here 또는 here을 참조하십시오.

기본적으로 이러한 솔루션의 배경은 하드 드라이브 (또는 다른 저장 장치)를 사용하여 데이터를 저장하고 필요할 때 필요한 부분을 메모리에 스왑 할 수있는 인터페이스를 제공하는 것입니다 (마치 virtual memory).

+0

감사합니다. 그러나 readTile() 메서드를 사용하여 읽을 샘플 코드가 없기 때문에 Tiff를 바둑판 식으로 읽는 것에 대해 의심 스럽습니다. 거대한 버퍼 배열을 처리 할 수 ​​있도록 조언을 구할 것입니다. 다시 한 번 감사드립니다! –

관련 문제