C# 使用LibTiff.net创建平铺Tiff
我使用LibTiff.net裁剪平铺Tiff的一部分并将其导出为平铺Tiff,但遇到了“无法将平铺图像写入剥离图像”的问题。当“Tiff.open”(“out.tif”,“w”)生成一个剥离图像时,我如何创建一个平铺的Tiff来填充输入数据C# 使用LibTiff.net创建平铺Tiff,c#,tiff,libtiff.net,C#,Tiff,Libtiff.net,我使用LibTiff.net裁剪平铺Tiff的一部分并将其导出为平铺Tiff,但遇到了“无法将平铺图像写入剥离图像”的问题。当“Tiff.open”(“out.tif”,“w”)生成一个剥离图像时,我如何创建一个平铺的Tiff来填充输入数据 using (Tiff input = Tiff.Open(@"E:\Sample_04.tif", "r")) { int width = input.GetField(TiffTag.IMAGEWIDTH)[0]
using (Tiff input = Tiff.Open(@"E:\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 config = input.GetField(TiffTag.PLANARCONFIG)[0].ToInt();
int tiles = 0;
int tileSize = input.TileSize();
byte[][] buffer = new byte[tileSize][];
int tileHeightCount = height / tileLentgh;
int tileWidthCount = width / tileWidth;
for (int y = 0; y < tileLentgh*5; y += tileLentgh)
{
for (int x = 0; x < tileWidth*5; x += tileWidth)
{
buffer[tiles] = new byte[tileSize];
input.ReadTile(buffer[tiles], 0, x, y, 0, 0);
tiles++;
}
}
// writing
using (Tiff output = Tiff.Open("out.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, config);
int c = 0;
for (int y = 0; y < tileLentgh*5; y += tileLentgh)
{
for (int x = 0; x < tileWidth*5; x += tileWidth)
{
output.WriteTile(buffer[c], x, y, 0, 0);
c++;
}
}
}
}
System.Diagnostics.Process.Start("555.tif");
}
使用(Tiff输入=Tiff.Open(@“E:\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.photomic)[0].ToInt();
int config=input.GetField(TiffTag.PLANARCONFIG)[0].ToInt();
int tiles=0;
int tileSize=input.tileSize();
字节[][]缓冲区=新字节[tileSize][];
int tileHeightCount=高度/tileLentgh;
int tileWidthCount=宽度/tileWidth;
对于(int y=0;y
要创建平铺TIFF,请不要使用
output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));
在使用
WriteTile
方法之前,您绝对必须设置TiffTag.TILEWIDTH
和TiffTag.TILELENGTH
字段。我不是c#或LibTiff.net开发人员,但我认为设置TiffTag.ROWSPERSTRIP
字段是图像“剥离”的原因“。如果你删除那行会怎么样?我在提问之前删除了这行,但什么也没发生。”。谢谢你的提示。我想问你为什么在for循环中用5乘以tileLength
和tileWidth
?(瓷砖是否比指示的大5倍?@ErikThysell我想裁剪主图像的一部分,因此我使用了例如沿tiff文件宽度的5个瓷砖和沿高度的5个瓷砖。是的,正如您提到的,我在编写tiff文件时忽略了瓷砖宽度和瓷砖长度属性。谢谢。