Bobrovskyは、ファイルの画像がタイル張りであるかどうかをチェックすべきで述べたように。以下では、ストリームtiffを読み込んで画像の左上部分をトリミングするスニペットコードを示しました。
using (Tiff input = Tiff.Open(@"imageFile.tif", "r"))
{
// get properties to use in writing output image file
int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
int height = input.GetField(TiffTag.IMAGELENGTH)[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 scanlineSize = input.ScanlineSize();
byte[][] buffer = new byte[height][];
for (int i = 0; i < height; ++i)
{
buffer[i] = new byte[scanlineSize];
input.ReadScanline(buffer[i], i);
}
using (Tiff output = Tiff.Open("splitedImage.tif", "w"))
{
output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
output.SetField(TiffTag.IMAGEWIDTH, width/2);
output.SetField(TiffTag.IMAGELENGTH, height/2);
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;
byte[][] holder = new byte[height][];
for (int i = height/2; i < height; i++)
//for (int j = 0; j < height/2 ; j++)
{
holder[i] = buffer[i].Skip(buffer[i].Length/2).ToArray();
output.WriteScanline(holder[i], c);
c++;
}
}
}
System.Diagnostics.Process.Start("splitedImage.tif");
イメージの他の部分については、forループの "i"の範囲を変更できます。
ああ、それは40 *ギガバイトです。私はそれが余分に挑戦するために32ビットのオペレーティングシステムしか持っていないと思いますか? –
私は64ビットハードウェアで動作していますが、ディスクから読み込むことが理想的な方法です。私はLibTiff.Netを深く探していますが、私が必要とする可能性のあるスキャンラインを読む機能があります – JWood
イメージの色、グレースケールまたは2レベルですか?バイレベルのために、私はメモリの問題を解決できるネイティブコードソリューションを持っています。私に電子メールを送ってください([email protected])。 – BitBank