2012-02-10 70 views
1

我周圍棟的算法的GUI更新圖像容器。爲此,我有一個Window組件,其中包含一個Image組件。當本地圖像源文件更改

圖像部件(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文件中調用算法函數之一。這將運行算法的一次迭代,最後將結果寫入上面的本地bmp文件(「c:\ a1.bmp」)。因此,圖像的基礎數據已經更新,我希望這可以反映在imgHolder組件中。爲了這個目的,我只是簡單地複製上面的代碼,只要我從函數返回。

這種方法的問題是,該算法將每次運行大約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對象的source屬性設置爲WriteableBitmap對象嗎?我假定一個沒有高速緩存策略還應在WrietableBitmap對象(這樣的變化反映在GUI) – filipcampeanu 2012-02-10 20:31:37

+0

我還沒有設置在XAML圖像控件的任何屬性上使用。只需像上面的例子那樣設置'image.Source = bitmap'就可以了。試試這個例子,圖片在每次鼠標移動時都會更新。我認爲'WritableBitmap'永遠不會被緩存。 – Clemens 2012-02-10 20:42:19

+0

添加XAML ... – Clemens 2012-02-10 20:50:43