2017-02-10 53 views
4

我正在使用以下代码将16位灰度图像序列(针对此问题的空数组)写入多页TIFF :使用libtiff.net编写大量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毫秒

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

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

+0

您很可能会遇到IO /内存瓶颈。你有没有分析内存和磁盘使用情况? –

+0

@DanField我不知道如何做适当的分析,但如果我用FileStream替换Tiff输出,数据速率平均值为250 MB/s,写入时间似乎是线性的。 1,000帧或10,000帧不会像TIFF那样有很大的不同。 – getter1

回答

3

我异型在Visual Studio(分析 - >性能分析器)代码中使用的CPU使用情况工具和这里是我的发现:

为5000页的时间约91%是花在写TIFF目录。不是数据,而是描述目录的结构。这看起来很可疑,所以我看了WriteDirectory做了那么久。

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

如果不更改库的代码,恐怕没有办法改变这种行为。