2012-02-10 90 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