【发布时间】:2010-05-08 21:01:06
【问题描述】:
我需要分离多帧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 方法几乎不需要任何处理时间。
我需要单帧,因为我需要处理它们(纠偏、旋转等)。
如果有与我完全不同的方法,我会很高兴听到它。
【问题讨论】:
-
您使用的是 64 位操作系统吗?执行时硬盘灯在做什么?
-
我使用的是 Windows 7 x64。硬盘几乎没有被使用(也尝试了来自 MemoryStream 的图像,也很慢)。在此过程中,一个 CPU 内核处于 100% 状态。将程序切换到 x86 会使该功能花费更长的时间。