Мне нужно разделить многокадровые файлы 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, разделение файла из 20 кадров занимает до 15 секунд на моем процессоре 2,5 ГГц. (Одно ядро находится на 100% в процессе)
При последующем сохранении изображений в один файл с использованием стандартного сжатия (LZW) время разделения LZW-файла составляет менее 1 секунды.
Сохранение со сжатием CCITT также занимает очень много времени.
Есть ли способ ускорить процесс?
редактировать:
Я измерил время выполнения:
sourceImage.SelectActiveFrame(objDimension, i);
sourceImage.Save(ms, ImageFormat.Tiff);
На каждый из этих двух вызовов приходится около 50% общего времени обработки. Использование одного MemoryStream с начальной емкостью, достаточной для всех изображений, не приводит к ощутимому приросту скорости. Метод Image.FromStream практически не требует времени обработки.
Мне нужны отдельные кадры, потому что мне нужно их обработать (устранить перекос, повернуть и т. д.).
Если есть совсем другой метод, чем мой, буду рад его услышать.