2016-10-27 4 views
0

私はこの画像がページの変更やスクロールして表示されているときFlowDocumentに追加された画像は、ビットマップデータとしてロードされたい。(ないのisVisibleプロパティ)どのように画像がFlowDocumentで見えるときに画像を動的に読み込むことができますか?

マイsenarioは、その画像(PNG、JPGですので... )はzipファイルにあります。 と私はメモリにzipファイルをロードし、メモリストリームに解凍します。 したがって、このメモリストリームはpng、jpgバイナリ(小さいサイズ)を持ちます。 このpngバイナリデータをBitmapImageクラスに変更します。 このbitmapImageクラスがflowDocumentに追加されました。

問題は、zipファイルには多くのイメージファイルがあり、イメージをBitmapImageクラスに変更すると、非常に多くのメモリサイズが必要になります。

ですので、以下に変更したいと思います。 1.圧縮解除されたイメージ(png、jpg ...)データをMemoryStreamに保存します。 2.このイメージをBitmapClassesに変更せずに追加します。 3.ページまたはスクロールを変更してイメージを表示する必要がある場合、イメージデータをビットマップクラスに動的に変更します。 しかし、私は上記の2番の方法を見つけることができません。 Display Image from Byte Array in WPF - Memory Issuesを試しましたが、状況は異なります。

どのように画像がFlowDocumentで見えるときに画像を動的に読み込むことができますか?

+0

FlowDocumentがロード/ビルドされていません。 – Paparazzi

+0

最終的にすべてのページをスクロールしたり、ドキュメントの最後までスクロールした場合はどうなりますか?とにかくすべての画像が見えるようになっているはずです。 – Clemens

答えて

1

この方法で試すことができます。 1. Imageクラスを拡張し、IsVisibleChangedイベントハンドラを追加します。 2.クラスにはメモリストリーム変数があります。 3.画像を追加するときは、Source以外のメモリストリームを追加するだけです。 4. IsVisibleChangedハンドラが呼び出されると、メモリストリームをソースに追加します。

これは私のサンプルコードです。

public class sampleImage : Image 
{ 
    public MemoryStream memoryStream = null; 
    public sampleImage() : base() 
    { 
     IsVisibleChanged += new DependencyPropertyChangedEventHandler(shandler); 
    } 
    void shandler(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (IsVisible) 
     { 
      memoryStream.Position = 0; 
      var bitmap = BitmapFrame.Create(memoryStream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
      Source = bitmap; 
     } else { 
      Source = null; 
      GC.Collect(); // it depends on you. 
     } 
    } 
} 
関連する問題