我需要分离多帧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方法几乎不需要任何处理时间。
我需要单帧,因为我需要处理它们(偏移校正,旋转等)。
如果方法与我的完全不同,我会很高兴听到它。
答案 0 :(得分:0)
在你的情况下要做的第一件事就是衡量。
在我们弄清楚如何加快速度之前,当然在我们使优化变得更加复杂之前,我们需要知道什么是慢速部分。幸运的是,你有一段很短的代码,所以只需要输入你自己的计时代码就可以了,然后我们可以更加明智地看一下。
这里说的是一些不知情的建议:
答案 1 :(得分:0)
Windows 7上的GDI +似乎存在问题。
我使用Windows XP在速度较慢的计算机上运行了一个示例程序,并且在压缩图像上的性能比我在Windows 7上的表现要好得多(大约快2-3倍)