我需要将 WPF 中 Tiff 图像中的所有帧打开到内存中,然后删除源。之后,我最终需要渲染该图像(根据窗口大小调整大小)。我的解决方案很慢,我无法在第一次要求之前删除文件源。有什么最佳实践吗?
问问题
5338 次
2 回答
7
采用CacheOption = BitmapCacheOption.OnLoad
此选项可以与BitmapImage.CacheOption
属性一起使用,也可以作为参数使用,BitmapDecoder.Create()
如果您想在加载图像后访问多个帧,则必须使用BitmapDecoder.Create
. 在任何一种情况下,文件都将被完全加载并关闭。
另请参阅我对这个问题的回答
更新
以下代码非常适合加载图像的所有帧并删除文件:
var decoder = BitmapDecoder.Create(new Uri(imageFileName), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
List<BitmapFrame> images = decoder.Frames.ToList();
File.Delete(imageFileName);
当然,您也可以在文件被删除后访问 decoder.Frames。
如果您更喜欢自己打开流,此变体也适用:
List<BitmapFrame> images;
using(var stream = File.OpenRead(imageFileName))
{
var decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
images = decoder.Frames.ToList();
}
File.Delete(imageFileName);
在任何一种情况下,它都比创建 a 更有效,MemoryStream
因为 aMemoryStream
一次在内存中保留了两个数据副本:解码的副本和未解码的副本。
于 2009-11-14T09:01:29.217 回答
0
我想到了。我必须使用MemoryStream:
MemoryStream ms = new MemoryStream(File.ReadAllBytes(image));
TiffBitmapDecoder decoder = new TiffBitmapDecoder(ms, BitmapCreateOptions.None, BitmapCacheOption.None);
List<BitmapFrame> images = new List<BitmapFrame>();
foreach (BitmapFrame frame in decoder.Frames) images.Add(frame);
于 2009-11-18T19:14:53.113 回答