我正在编写一个处理TIFF图像的C#应用程序(主要显示文件,重新排序页面,删除页面,拆分多页图像,将单个图像合并为一个多页图像等)。
我们处理的大多数图像都较小(文件大小和页码都有),但有些较大的图像。
显示图像时,我们需要将多页TIFF文件拆分为List,以便缩略图可以显示在ListView中。我们面临的问题是,对于较大的文件,执行拆分需要太长时间。例如。我刚刚测试了一个304页面的图像(只有10mb)并将所有页面拆分成列表需要137,145ms(137.14秒,或2m 17s),这太慢了。
我正在使用的代码是:
private void GetAllPages(string file)
{
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
List<Image> images = new List<Image>();
Bitmap bitmap = (Bitmap)Image.FromFile(file);
int count = bitmap.GetFrameCount(FrameDimension.Page);
for (int idx = 0; idx < count; idx++)
{
// save each frame to a bytestream
bitmap.SelectActiveFrame(FrameDimension.Page, idx);
System.IO.MemoryStream byteStream = new System.IO.MemoryStream();
bitmap.Save(byteStream, ImageFormat.Tiff);
// and then create a new Image from it
images.Add(Image.FromStream(byteStream));
}
watch.Stop();
MessageBox.Show(images.Count.ToString() + "\nTime taken: " + watch.ElapsedMilliseconds.ToString());
}
有关我可以做什么或应该注意什么以加快此过程的任何提示或指示?我知道它可以更快地完成 - 我只是不知道如何。
谢谢!
答案 0 :(得分:1)
如果我使用PresentationCore.dll(WPF)中的TiffBitmapDecoder
类,然后使用它创建Bitmap
实例,我可以更快地加载帧(10s与70s,150 MB)带360帧的TIFF。)
List<Image> images = new List<Image>();
Stream imageStreamSource = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.None, BitmapCacheOption.Default);
foreach (BitmapSource bitmapSource in decoder.Frames)
{
Bitmap bmp = new Bitmap(bitmapSource.PixelWidth, bitmapSource.PixelHeight, PixelFormat.Format32bppPArgb);
BitmapData data = bmp.LockBits(new Rectangle(System.Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb);
bitmapSource.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
bmp.UnlockBits(data);
images.Add(bmp);
}