2

WPF の Tiff イメージからすべてのフレームをメモリに開き、ソースを削除する必要があります。その後、最終的にその画像をレンダリングする必要があります(ウィンドウサイズに応じてサイズ変更されます)。私のソリューションは非常に遅く、最初の要求の前にファイル ソースを削除できません。ベストプラクティスはありますか?

4

2 に答える 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 に答える