I need to separate multiframe tiff files, and use the following method:
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;
}
It works fine, but if the source image was encoded using the CCITT T.6 compression, separating a 20-frame-file takes up to 15 seconds on my 2,5ghz CPU.(One core is at 100% during the process)
When saving the images afterwards to a single file using standard compression (LZW), the separation time of the LZW-file is under 1 second.
Saving with CCITT compression also takes very long.
Is there a way to speed up the process?
edit:
I have measured the execution times:
sourceImage.SelectActiveFrame(objDimension, i);
sourceImage.Save(ms, ImageFormat.Tiff);
These two calls each account for around 50% of the total processing time. Using one MemoryStream with an initial capacity big enough for all images results in no measurable speed gain. The Image.FromStream method takes barely any processing time.
I need the single frames because I need to process them(deskew, rotate, etc.).
If there is a completely different method than mine, I would be happy to hear it.