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");
}
32 또는 64 비트 프로세스? – stuartd
그것은 32 비트 프로세서입니다. –
기계에는 얼마만큼의 램이 있습니까? 얼마나 많은 스왑/페이지 파일 공간이 구성/사용 가능합니까? 예외가 발생했을 때 프로세스가 소비하는 메모리 량은 어느 정도입니까? – DarkSquirrel42