c# – 使用libtiff.net编写大量TIFF页面的有效方法

我正在使用以下代码将一系列16位灰度图像(用于此问题的空数组)写入多页TIFF:

int numberOfPages = 1000;
int width = 256;
int height = 256;
string fileName = "test.tif";

ushort[] image = new ushort[width * height];
byte[] buffer = new byte[width * height * sizeof(ushort)];

Stopwatch stopWatch = new Stopwatch();

using (Tiff output = Tiff.Open(fileName, "w"))
{
    if (output == null)
    {
        return;
    }
    stopWatch.Start();
    for (int i = 0; i < numberOfPages; i++)
    {
        Buffer.BlockCopy(image, 0, buffer, 0, buffer.Length);

        output.SetField(TiffTag.IMAGEWIDTH, width);
        output.SetField(TiffTag.IMAGELENGTH, height);
        output.SetField(TiffTag.SAMPLESPERPIXEL, 1);
        output.SetField(TiffTag.BITSPERSAMPLE, 16);
        output.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT);
        output.SetField(TiffTag.XRESOLUTION, 96);
        output.SetField(TiffTag.YRESOLUTION, 96);
        output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
        output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);
        output.SetField(TiffTag.COMPRESSION, Compression.NONE);
        output.SetField(TiffTag.FILLORDER, FillOrder.MSB2LSB);
        output.SetField(TiffTag.SUBFILETYPE, FileType.PAGE);
        output.SetField(TiffTag.PAGENUMBER, i + 1, numberOfPages);

        output.WriteEncodedStrip(0, buffer, buffer.Length);

        output.WriteDirectory();
    }
    stopWatch.Stop();
}

Debug.WriteLine(stopWatch.ElapsedMilliseconds);

它可以正常工作几百页,但似乎执行时间不会随着页面数量的增加而线性扩展.例如 :

1000 pages — 3130 ms

2000 pages — 11778 ms

3000 pages — 25830 ms

我也尝试在循环中使用追加模式,但得到了类似的结果.

我这样做错了还是我应该期待这种开销?

解决方法:

我使用CPU使用率工具在Visual Studio(Analyze – > Performance Profiler)中分析了您的代码,以下是我的发现:

对于5000页,大约91%的时间用于编写TIFF目录.不是数据,而是描述目录的结构.这看起来很可疑,所以我看了WriteDirectory做了那么长时间.

WriteDirectory尝试链接上一个和新创建的目录.为此,它会始终从第一个目录开始搜索以前的目录. TIFF中的目录越多,添加每个新目录所需的时间就越长.

我担心,如果不改变库的代码,就无法改变这种行为.

上一篇:c# – 在Windows 7 / .Net 4.0上将多页Tiff拆分为单个Tiff


下一篇:如何在python中将图像转换为16bit zip(deflate)压缩TIF?