2016-06-07 5 views
0

아이디어는로드 된 이미지를 처리하는 것입니다. 나는 먼저 이미지를 처리하는 흰색/검은 선이 있다는 식으로 처리하려고했습니다. 실제 문제는 새로운 Thread (Thread.Sleep 용)가 처리하는 동안 전체 UI를 고정 시킨다는 것입니다. Dispatcher를 시도 할 때 이미지가 업데이트되지 않습니다.MVVM Writeablebitmap 이미지 처리

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); 
      } 
     })); 

      }; 

감사

그래서 나는 ProcessingClass을 얻었다.

답변

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