3

主にアドバイスをお願いします。

私のプログラムは、画面に複数の大きな画像を表示します。それぞれ1〜4 mbsです。150DPI、解像度6000x4000、深さ24ビット。

私は私に小さな画像を与える他の多くの設定を持っています..しかし私は高品質の画像が必要です..

わかりました、それで遅いです..しかしそれほど遅くはありません...唯一の本当に悪い部分は私が1つの画像から別の画像に切り替えるときです..

つまり、基本的に、画像ごとに2つの画像があります。1つの親指と1つのHQ ..ユーザーが画像にズームインすると、HQをロードし、ユーザーがズームアウトすると、親指の画像に切り替わります。

その切り替えポイントで、ユーザーはHQイメージがメモリにロードされて画面に描画されるまで約4〜8秒待つ必要があります。

以下は、HQイメージをロードするときに使用するコードです。

using (DrawingContext dc = ActiveImage.imageDV.RenderOpen())
                {
    FileStream fs = new FileStream(ActiveImage.imagePath, FileMode.Open, FileAccess.Read, FileShare.Read);

    MemoryStream ms = new MemoryStream();
    fs.CopyTo(ms);
    ms.Seek(0, SeekOrigin.Begin);
    fs.Close();

    BitmapImage bitmap = new BitmapImage();
    bitmap.BeginInit();
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.CreateOptions = BitmapCreateOptions.DelayCreation;
    bitmap.StreamSource = ms;
    bitmap.EndInit();
    //bitmap.Freeze();

    dc.DrawImage(bitmap, new Rect(ActiveImage.position, ActiveImage.size));
}

以下は、Thumb画像をロードするときに使用するコードです

using (DrawingContext dc = ActiveImage.imageDV.RenderOpen())
{
    FileStream fs = new FileStream(ActiveImage.thumbPath, FileMode.Open, FileAccess.Read, FileShare.Read);

    MemoryStream ms = new MemoryStream();
    fs.CopyTo(ms);
    ms.Seek(0, SeekOrigin.Begin);
    fs.Close();

    BitmapImage bitmap = new BitmapImage();
    RenderOptions.SetBitmapScalingMode(bitmap, BitmapScalingMode.NearestNeighbor);
    bitmap.BeginInit();
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.CreateOptions = BitmapCreateOptions.DelayCreation;
    bitmap.StreamSource = ms;
    bitmap.EndInit();
    //bitmap.Freeze();

    dc.DrawImage(bitmap, new Rect(ActiveImage.position, ActiveImage.size));
}

これを最適化する方法はありますか?もっと良い方法はありますか?ユーザーが単一の画像を見ている場合にのみ、HQの透明な画像が必要であることを忘れないでください。

MemoryStreamが出てくると思いますが、一種のテストとして追加しました。

4

1 に答える 1

0

単なる推測ですが、潜在的な最適化をすべて WPF に任せ、その URI で画像をロードするのがおそらく「最良の」解決策ではないでしょうか。

using (DrawingContext dc = ActiveImage.imageDV.RenderOpen())
{
    var bitmap = new BitmapImage(new Uri(ActiveImage.imagePath));
    // alternatively, if it is a relative path
    // var bitmap = new BitmapImage(new Uri(ActiveImage.imagePath, UriKind.Relative));

    dc.DrawImage(bitmap, new Rect(ActiveImage.position, ActiveImage.size));
}
于 2013-03-24T17:31:38.217 に答える