在C#中快速加载/读取TIFF文件

时间:2017-06-04 11:15:48

标签: c# tiff

我正在编写一个处理TIFF图像的C#应用​​程序(主要显示文件,重新排序页面,删除页面,拆分多页图像,将单个图像合并为一个多页图像等)。

我们处理的大多数图像都较小(文件大小和页码都有),但有些较大的图像。

显示图像时,我们需要将多页TIFF文件拆分为List,以便缩略图可以显示在ListView中。我们面临的问题是,对于较大的文件,执行拆分需要太长时间。例如。我刚刚测试了一个304页面的图像(只有10mb)并将所有页面拆分成列表需要137,145ms(137.14秒,或2m 17s),这太慢了。

我正在使用的代码是:

private void GetAllPages(string file)
{
    System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
    watch.Start();
    List<Image> images = new List<Image>();
    Bitmap bitmap = (Bitmap)Image.FromFile(file);
    int count = bitmap.GetFrameCount(FrameDimension.Page);
    for (int idx = 0; idx < count; idx++)
    {
        // save each frame to a bytestream
        bitmap.SelectActiveFrame(FrameDimension.Page, idx);
        System.IO.MemoryStream byteStream = new System.IO.MemoryStream();
        bitmap.Save(byteStream, ImageFormat.Tiff);

        // and then create a new Image from it
        images.Add(Image.FromStream(byteStream));
    }
    watch.Stop();
    MessageBox.Show(images.Count.ToString() + "\nTime taken: " + watch.ElapsedMilliseconds.ToString());
}

有关我可以做什么或应该注意什么以加快此过程的任何提示或指示?我知道它可以更快地完成 - 我只是不知道如何。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我使用PresentationCore.dll(WPF)中的TiffBitmapDecoder类,然后使用它创建Bitmap实例,我可以更快地加载帧(10s与70s,150 MB)带360帧的TIFF。)

 List<Image> images = new List<Image>();
 Stream imageStreamSource = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);
 TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.None, BitmapCacheOption.Default);
 foreach (BitmapSource bitmapSource in decoder.Frames)
 {
     Bitmap bmp = new Bitmap(bitmapSource.PixelWidth, bitmapSource.PixelHeight, PixelFormat.Format32bppPArgb);
     BitmapData data = bmp.LockBits(new Rectangle(System.Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb);
     bitmapSource.CopyPixels(Int32Rect.Empty,  data.Scan0,  data.Height * data.Stride, data.Stride);
     bmp.UnlockBits(data);
     images.Add(bmp);
 }