2012-12-08 2 views
1

Image 컨트롤에 연결된 Windows Phone 8 응용 프로그램에 WriteableBitmap이 있습니다. 나는 이미지의 각 행을 반복하고 한 번에 비동기 적으로 픽셀 행을 페인팅 한 다음 페인팅을 위해 다음 행을 예약합니다. 그러나 기본 픽셀 데이터를 변경해도 컨트롤이 업데이트되지 않도록 속성이 변경되지는 않습니다. 이미지 소스를 동일한 픽셀에서 작성된 새로운 WriteableBitmap으로 설정하면 이미지가 잘 업데이트되지만 과도한 배열 복사가 많이 발생합니다.WriteableBitmap 픽셀의 변경 내용이 화면을 업데이트하지 않습니다.

void PaintImage(object state) 
{ 
    // get my height, width, row, etc. from the state 
    int[] bitmapData = new int[width]; 
    // load the data for the row into the bitmap 

    Dispatcher.BeginInvoke(() => 
    { 
     var bitmap = ImagePanel.Source as WriteableBitmap; 
     Array.Copy(bitmapData, 0, bitmap.Pixels, row * width, bitmapData.Length); 

     if (row < height - 1) 
     { 
      var newState = ... // create new state 
      ThreadPool.QueueUserWorkItem(PaintImage, newState); 
     } 
    }); 
} 

나는 위의 Array.Copy 후이 라인을 추가 할 경우, 비트 맵은 점진적으로 화면에 그려집니다 (실제로는 단지 비트 맵마다 대체하고 있지만) :

var newBitmap = new WriteableBitmap(width, height); 
Array.Copy(bitmap.Pixels, newBitmap.Pixels, newBitmap.Pixels.Length); 
ImagePanel.Source = newBitmap; 

그것은 것 같다를 WriteableBitmap 수동으로 일부 속성 변경 알림을 발생시켜 이미지가있는 알림이 필요합니다. ViewModel의 WriteableBitmap에 이미지를 바인딩하면이 문제가 사라질 것입니다.

+0

당신이 전체를 교체 한 후 도면을 완성하고 전체 그림을 위해 기다릴 수 없어 더러운 사각형을 추가 새로운 업데이트 된 그림이있는 imageSource? – robertk

+0

아니, 그게 내가 원하는 기능이 아니야. – sohum

+0

그런 다음 가장 쉬운 방법은 아마 그것을 VM에 바인딩하고 그림을 새로 고칠 때마다 RaisePropertyChanged()를 수행하는 것입니다. – robertk

답변

1

그냥 당신이 백그라운드 스레드에있는 경우

_myBitmap.Lock(); 
_myBitmap.AddDirtyRect(new Int32Rect(0, 0, _myBitmap.PixelWidth, _myBitmap.PixelHeight)); 
_myBitmap.Unlock(); 

가 또는

Application.Current.Dispatcher.InvokeAsync(() => 
    { 
     _myBitmap.Lock(); 
     _myBitmap.AddDirtyRect(new Int32Rect(0, 0, _myBitmap.PixelWidth, _myBitmap.PixelHeight)); 
     _myBitmap.Unlock(); 
    });