2012-02-10 11 views
1

私はアルゴリズムの周りにGUIをビルドしています。この目的のために、私はそれの中にイメージコンポーネントを含むウィンドウコンポーネントを持っています。ローカルイメージソースファイルが変更されたときにイメージコンテナを更新する

イメージ成分(imgHolder)内のコンテンツは、この例の目的のためのように初期化されるのBitmapImageオブジェクト(_image)、次式で与えられる。

_image = new BitmapImage(); 
_image.BeginInit(); 
_image.CacheOption = BitmapCacheOption.OnLoad; 
_image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
_image.UriSource = new Uri("c:\\a1.bmp"); 
_image.EndInit(); 

imgHolder.Source = _image; 

ウィンドウを含むメインプログラムを実行しますMatlab DLLファイル内からアルゴリズムの関数の1つを呼び出す。これはアルゴリズムの1回の反復を実行し、その結果として上のローカルbmpファイル( "c:\ a1.bmp")に結果を書き込みます。その結果、イメージの基礎となるデータが更新されました。これをimgHolderコンポーネントに反映させたいと思います。この目的のために、関数から戻るたびに上記のコードを単純に複製しています。

このアプローチの問題は、アルゴリズムが1回の実行あたり約100回の反復を持つため、これが100回発生しなければならないことです。それは正しいとは思わない。私は同じファイルからすべての100ビットマップ画像を作成しています。

これを調べると、memorystreamを代わりに使用できることがわかりましたが、アルゴリズムが実行されるときに100枚の画像を作成する必要があるように見えるので、これは劇的な改善かどうかは疑問です。どういうわけか、基礎となるバッファを直接変更することはできませんか? GetPixelとSetPixelは、呼び出されるたびにロックを設定するので、あまり効率的ではないと聞きました。おそらく同じ_imageオブジェクトを使ってこれを行うことは可能でしょうか?これがローカルファイルではない場合は、キャッシュなしオプションを使用できた可能性があり、「単独で」動作するはずです。ロックされているため、キャッシュされていないオプションがローカルになっているファイルが動作しませんでした。

もっと良いアイデアはありますか?

ありがとうございます!

答えて

2

ビットマップの生データへのアクセス権があるかどうか、またはいつもファイルに書き込まれているかどうかはよくわかりません。あなたはSetPixelに言及しているので、私はあなたが持っていると思います。

WritableBitmap_image.Sourceとし、その内容をWritePixelsの方法で循環的に更新することができます。

単純なパターンですべてのマウス移動の画像を更新する次の例を試しました。

XAML:

<Window ...> 
    <Grid> 
     <Image Name="image" /> 
    </Grid> 
</Window> 

コード:

public partial class MainWindow : Window 
{ 
    private WriteableBitmap bitmap = new WriteableBitmap(100, 100, 96d, 96d, PixelFormats.Rgb24, null); 
    private byte[] buffer = new byte[30000]; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     image.Source = bitmap; 
    } 

    private void OnMouseMove(object sender, MouseEventArgs e) 
    { 
     Point pos = e.GetPosition(image); 
     int offset = (int)pos.X + (int)pos.Y; 

     for (int i = 0; i < buffer.Length; i++) 
     { 
      buffer[i] = (byte)(i + offset); 
     } 

     bitmap.WritePixels(new Int32Rect(0, 0, 100, 100), buffer, 300, 0); 
    } 
} 
+0

おかげで、これは私が探している解決策のように見えます。 WriteableBitmapが変更されるたびに更新されるように、これをImageに結びつけるにはどうすればよいですか? ImageオブジェクトのsourceプロパティをWriteableBitmapオブジェクトに設定するだけで、それを行うことはできますか?私はキャッシュポリシーもWrietableBitmapオブジェクトで採用する必要があると仮定します(GUIに変更が反映されるように) – filipcampeanu

+0

XAMLのImageコントロールでプロパティを設定していません。上記の例のように 'image.Source = bitmap'を設定すれば、すべてが動作します。この例を試してみると、マウスの移動ごとにImageが更新されます。私は 'WritableBitmap'は決してキャッシュされないと思います。 – Clemens

+0

XAMLを追加しました。 – Clemens

関連する問題