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

C# 使用libtiff.net编写大量TIFF页面的有效方法,c#,tiff,libtiff.net,C#,Tiff,Libtiff.net,我使用以下代码将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 stopWa

我使用以下代码将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);
int numberOfPages=1000;
整数宽度=256;
整数高度=256;
字符串fileName=“test.tif”;
ushort[]图像=新的ushort[宽度*高度];
字节[]缓冲区=新字节[宽度*高度*大小(ushort)];
秒表秒表=新秒表();
使用(Tiff输出=Tiff.Open(文件名,“w”))
{
if(输出==null)
{
返回;
}
秒表。开始();
对于(int i=0;i
它可以在几百页内正常工作,但执行时间似乎不会随着页面数量的增加而线性增加。例如:

1000页--3130毫秒

2000页--11778毫秒

3000页--25830毫秒

我还尝试在循环中使用append模式,但得到了类似的结果


我这样做是错误的还是应该期望这种开销?

我使用CPU使用率工具在Visual Studio(分析->性能分析器)中分析了您的代码,以下是我的发现:

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

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


如果不更改库的代码,恐怕无法更改此行为。

您很可能遇到IO/内存瓶颈。您分析过内存和磁盘使用情况吗?@DanField我不确定如何进行正确的分析,但如果我用FileStream替换Tiff输出,数据速率平均为250 MB/s,写入时间似乎是线性的。1000帧或10000帧与TIFF没有太大区别。