2016-06-07 66 views
0

这个想法是处理加载的图像。我首先想要以这种方式处理它,通过图像出现白色/黑色线条。 实际的问题是,一个新的线程(for Thread.Sleep)在处理时冻结了整个UI。当我尝试分派器时,图像不会更新。MVVM Writeablebitmap图像处理

于是我找来了ProcessingClass:

public WriteableBitmap GetProcessedPicture(int i) 
     { 
      WriteableBitmap wb = image.image; 

      Process(ref wb, i); 

      return wb; 
     } 

     private void Process(ref WriteableBitmap wb, int j) 
     { 
      int stride = wb.PixelWidth * (wb.Format.BitsPerPixel + 7)/8; 

      byte[] data = new byte[stride * wb.PixelHeight]; 

      for (int i = 0; i < data.Length; i++) data[i] = 255; 

//just to see some changes 
      wb.WritePixels(new Int32Rect(j, 0, 100, 100), data, stride, 0); 

     } 

而且MainViewModel类(我使用MVVM光):

public void Start_Click() 
     { 
         Application.Current.Dispatcher.BeginInvoke(new Action(() => 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       ImageSource = processingClass.GetProcessedPicture(i); 

       Thread.Sleep(100); 
      } 
     })); 

      }; 

感谢您的帮助。

回答

0

我不认为ImageSource(假设它绑定到Image.Source)接受WriteableBitmap。你必须先将它转换成BitmapImage

调整你的代码有点我会做这样的事情:

public void Start_Click() 
{ 
    var t = new Task(() => 
    { 
     for (var i = 0; i < 100; i++) 
     { 
      var writeablebitmap = processingClass.GetProcessedPicture(i); 
      var bitmapImage = processingClass.ConvertToBitmapImage(writeablebitmap); 

      Application.Current.Dispatcher.BeginInvoke(new Action(() => 
      { 
       ImageSource = bitmapImage; 
      })); 

      Thread.Sleep(100); 
     } 
    }); 
    t.Start(); 
} 

这样,你不拖延与图像处理的UI线程,但你仍然更新UI线程上的图像。

至于转换您WriteableBitmapBitmapImage,有很多在互联网上提供的资源,像this one

+0

是,'ImageSource'是Image.Source,但它接受'WriteableBitmap'是没有问题的,当我初始化它。 但我试过你的代码,它引发了同样的'InvalidOperationException',我得到了eralier。 – Matthias

+0

您是否在UI线程上创建了WriteableBitmap?否则,可能会扩大你的'InvalidOperationException'。您可能还想阅读https://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspx上的注释,以确保您在线程化时可以正确执行。 – ManIkWeet