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毫秒
我也用追加模式尝试在循环内,但得到了类似的结果。
我这样做是错误的,还是我应该期待这种开销?
您很可能会遇到IO /内存瓶颈。你有没有分析内存和磁盘使用情况? –
@DanField我不知道如何做适当的分析,但如果我用FileStream替换Tiff输出,数据速率平均值为250 MB/s,写入时间似乎是线性的。 1,000帧或10,000帧不会像TIFF那样有很大的不同。 – getter1