2012-01-16 4 views
1

私は、WPFコントロール内にmutlipage tiffを「プレビュー」しているデータバインドされたオブジェクトを持っています。データバインドされたWPF、複数ページのTIFF、メモリストリーム、パフォーマンス

このオブジェクトには、Public PreviewImageとCurrentPreviewPageがあります。

これには、MemoryStreams(それぞれTiffのページを表す)のコレクションであるプライベートPreviewPagesがあります。 PreviewImage(1回目)の取得に際して

このコードが実行されます。

if (PreviewPages.Count == 0) 
{ 
    Image myImg = System.Drawing.Image.FromFile(_LocalFile); 

    for (int i = 0; i < (NumberOfPages); i++) 
    { 
     myImg.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i); 
     System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
     myImg.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff); 
     PreviewPages.Add(ms); 
    } 
} 

は、前のコードは1100キロバイト17ページTIFFのために実行するのに約10秒かかります。これを処理するにはより良い方法が必要です。 はその後、これが呼び出されます。

BitmapImage bi = new BitmapImage(); 
bi.BeginInit(); 
bi.DecodePixelWidth = 1000; 
//bi.UriSource = new Uri(fiTemp.FullName); 
bi.StreamSource = new System.IO.MemoryStream(PreviewPages[CurrentPreviewPage - 1].ToArray()); 
bi.EndInit(); 
_PreviewImage = bi; 

は今、このコードは幻想作品初期化後(あなたがバウンドのスライダーをドラッグすることができますように、早くページを変更することができます)。どんな助けでも大歓迎です。

+0

なぜ17ページすべてを読み込むのですか?ユーザーは1つのページだけを一瞬で見ることができますか?最初のものから順に、それらをseorateスレッドのキューに順番にロードします。たとえば、Adobe Reader、Google Docsなどがそうです。 – Tigran

+0

プライマリスレッドの最初のページを読み込み、バックグラウンドの追加ページを読み込みます。BackGroundWorkerを参照してください。プライマリスレッドのみがUIにアクセスできます。 BackGroundWorkerでは、ページを2つずつ取得するか、一度に取得するかを決定する必要があります。ページ2をUIスレッドに持ってくるまで、ユーザーはページ2にアクセスできません。 – Paparazzi

+0

それは本当ですが、私はまだ最初の問題に終わりますが、おそらくこれが最善のアプローチです。誰かが他のコメントや予約をしているかどうかがわかります。 – elbweb

答えて

2

メインスレッドで最初のページを読み込み、バックグラウンドで追加ページを読み込みます(BackGroundWorkerを参照)。プライマリスレッドのみがUIにアクセスできます。 BackGroundWorkerでは、ページを2つずつ取得するか、一度に取得するかを決定する必要があります。ページ2をUIスレッドに持ってくるまで、ユーザーはページ2にアクセスできません。私はキャンセルを実装するだろう。ユーザーがあきらめたら、CPUを縛りたくない。

+0

これはうまくいく答えです。私はまだファイル/メモリストリームを開く方法を試してみると、より高速な方法でアクセスできるかどうかがわかります。 – elbweb

+0

イメージ・オブジェクトのRawFormatを使用するようにプロセスの要点を変更しました(できればそれを変換しないことを強くお勧めします)。私はこれをそのまま残し、ユーザーに何がロードされているか/まだロードされていないかを示すためのより良いインターフェースを構築します。ありがとう! – elbweb

関連する問題