使用libtiff.net高效地编写大量TIFF页面的方法

4
我正在使用下面的代码将一系列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页 --- 3130毫秒

2000页 --- 11778毫秒

3000页 --- 25830毫秒

我也尝试了在循环内使用附加模式,但结果类似。

我是做错了什么还是应该预计这种开销?


你很可能遇到了IO/内存瓶颈。你有对内存和磁盘使用进行过分析吗? - Dan Field
@DanField我不确定如何进行正确的性能分析,但如果我将Tiff输出替换为FileStream,则数据速率平均为250 MB / s,并且写入时间似乎是线性的。 与TIFF不同,1000帧或10000帧并没有太大的区别。 - getter1
1个回答

3
我使用 Visual Studio(分析 -> 性能分析器)的 CPU 使用工具对您的代码进行了分析,以下是我的发现:
5000页中,大约有91%的时间用于编写TIFF目录。此处指的是描述目录结构的内容,而非数据本身。这看起来很可疑,因此我查看了长时间运行的 WriteDirectory 做了什么。 WriteDirectory 尝试将先前和新创建的目录链接起来。为此,它始终从第一个目录开始搜索先前的目录。TIFF 中存在的目录越多,添加每个新目录所需的时间就越长。
恐怕无法通过不改变库代码的方式更改此行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接