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);
どちらの場合でも、 は一度に 2 つのデータのコピー (デコードされたコピーとデコードされていないコピー) をメモリに保持するMemoryStream
ため、を作成するよりも効率的です。MemoryStream
于 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 に答える