使用压缩“CCITT T.6”分离多页tiff非常慢

时间:2010-05-08 21:01:06

标签: c# image tiff

我需要分离多帧tiff文件,并使用以下方法:

public static Image[] GetFrames(Image sourceImage)
{
    Guid objGuid = sourceImage.FrameDimensionsList[0];
    FrameDimension objDimension = new FrameDimension(objGuid);
    int frameCount = sourceImage.GetFrameCount(objDimension);
    Image[] images = new Image[frameCount];
    for (int i = 0; i < frameCount; i++)
    {
        MemoryStream ms = new MemoryStream();
        sourceImage.SelectActiveFrame(objDimension, i);
        sourceImage.Save(ms, ImageFormat.Tiff);
        images[i] = Image.FromStream(ms);
    }
    return images;
}

它工作正常,但如果使用CCITT T.6压缩编码源图像,则在我的2,5ghz CPU上分离20帧文件需要 15秒。核心在此过程中达到100%)

使用标准压缩(LZW)将图像保存到单个文件后,LZW文件的分离时间小于1秒

使用CCITT压缩保存也需要很长时间。

有没有办法加快这个过程?

编辑:

我已经测量了执行时间:

        sourceImage.SelectActiveFrame(objDimension, i);
        sourceImage.Save(ms, ImageFormat.Tiff);

这两个电话每个占总处理时间的50%左右。 使用一个具有足够大的初始容量的MemoryStream可以实现所有图像,从而不会产生可测量的速度增益。 Image.FromStream方法几乎不需要任何处理时间。

我需要单帧,因为我需要处理它们(偏移校正,旋转等)。

如果方法与我的完全不同,我会很高兴听到它。

2 个答案:

答案 0 :(得分:0)

在你的情况下要做的第一件事就是衡量。

在我们弄清楚如何加快速度之前,当然在我们使优化变得更加复杂之前,我们需要知道什么是慢速部分。幸运的是,你有一段很短的代码,所以只需要输入你自己的计时代码就可以了,然后我们可以更加明智地看一下。

这里说的是一些不知情的建议:

  1. 我认为这些图像相当大并且都具有相同的尺寸,因此不是为每个图像创建一个新的内存流并且动态地增长它,为什么不构建一个足够大的 MemoryStream 然后对所有这些使用它,这将减少方法创建的垃圾量并减少总体分配数。
  2. 你说你正在以100%的方式锁定你的一个核心,所以我们应该尝试使用多个核心。您可以尝试跨多个线程拆分工作。也许有一个线程将帧保存到 MemoryStreams ,另一个可以将它们加载到新图像中,它们可以通过工作队列进行通信。
  3. 你说你正在分裂它然后你说你再次保存它,也许你可以直接保存而不是通过中间的另一个图像对象。

答案 1 :(得分:0)

Windows 7上的GDI +似乎存在问题。

我使用Windows XP在速度较慢的计算机上运行了一个示例程序,并且在压缩图像上的性能比我在Windows 7上的表现要好得多(大约快2-3倍)