简体   繁体   English

使用LibTiff.net创建平铺的Tiff

[英]Create a tiled Tiff using LibTiff.net

I used LibTiff.net to crop part of a tiled Tiff and export it as a tiled Tiff but encountered the problem of "can not write tiles image to a stripped image". 我使用LibTiff.net裁剪了一部分平铺的Tiff,并将其导出为平铺的Tiff,但是遇到了“无法将平铺图像写入剥离图像的问题”。 While the "Tiff.open("out.tif","w") make a stripped image, How can I create a tiled-Tiff to fill it with input data? 当“ Tiff.open(” out.tif“,” w“)生成剥离的图像时,如何创建平铺的Tiff以用输入数据填充它?

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");

    }

To create a tiled TIFF please don't use 要创建平铺的TIFF,请不要使用

output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));

And you absolutely must set TiffTag.TILEWIDTH and TiffTag.TILELENGTH fields before using WriteTile method. 而且,在使用WriteTile方法之前,您绝对必须设置TiffTag.TILEWIDTHTiffTag.TILELENGTH字段。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM