3

마우스 포인터를 움직일 때마다 원을 그려서 이미지를 업데이트하려고합니다. pixelBuffer는 map 개체에 저장되고 CircleFilledWithGradientMethod()으로 업데이트됩니다. WriteableBitmap Bitmap에 픽셀 버퍼를로드 한 다음 내 XAML UI의 이미지 요소 이미지 소스를 비트 맵으로 설정하여 표시하려고합니다. 어떻게하면 마우스를 처음 움직이면 맨 처음 2 개의 원이 그려지지만 마우스를 움직이면 이미지가 업데이트되지 않습니다. 왜 그럴 수 있죠? Image에 강제로 다시 그려야하는 메서드가 있습니까? 제가 stream.WriteAsync을 두 번 사용하는 이유는 방금 하나를 사용할 수 있었을 때 제대로 작동하고 있음을 보여주기 위해서입니다. 나는 무슨 일이 일어나고 무슨 생각WritableBitmap이 변경된 후에 인터페이스의 이미지가 업데이트되지 않습니다.

private async void TextArea_PointerMoved(object sender, PointerRoutedEventArgs e) 
      { 
       Pixel pixel1 = new Pixel(255, 0, 0); 
       Pixel pixel2 = new Pixel(255, 255, 255); 

       map.CircleFilledWithGradient((int) pointer.Position.X, (int)pointer.Position.Y, 100, pixel1, pixel2); 

       using (Stream stream = Bitmap.PixelBuffer.AsStream()) 
       { 
        stream.WriteAsync(map.pixelData, 0, map.pixelData.Length); 
       } 
       map.CircleFilledWithGradient((int)pointer.Position.X+100, (int)pointer.Position.Y, 100, pixel1, pixel2); 

       using (Stream stream = Bitmap.PixelBuffer.AsStream()) 
       { 
        stream.WriteAsync(map.pixelData, 0, map.pixelData.Length); 
       } 
       this.Image.Source = Bitmap; 
      } 

는 최대한 빨리이 화면에 이미지를 그릴 때, 그것을 캐시 한 후 기존 이미지를 사용하여 유지한다는 것이다. 아니면 표준 이미지 요소가 다시 그리기를 지원하지 않습니까?

업데이트 : 내 Bitmap은 개인 클래스 변수입니다. 내가 할 경우

WriteableBitmap Bitmap = new WriteableBitmap((int)this.ActualWidth, (int)this.Grid.RowDefinitions[1].ActualHeight); 

모두 작동하기 시작하지만 메모리가 비효율적이지 않습니까? 마우스를 움직일 때마다 각각 새로운 WriteableBitmap에 대한 메모리를 할당하지 않습니까? 그리고 내가 알아 낸 바에 따르면이 문제는 이미지 구성 요소와 관련이 있습니다. 왜 소스 코드를 변경하더라도 업데이트되지 않지만 소스 코드를 다른 객체로 변경하면 업데이트됩니다. `

답변

1

이미지를 강제로 다시 그리기 위해 호출해야하는 메소드가 있습니까?

닫기. WriteableBitmap에 대한 메소드가 있습니다.

새로 고침을 요청하기 위해 업데이트 한 후 WriteableBitmap.Invalidate으로 전화하십시오.

this.Image.Source = Bitmap; 

으로 : 비트 맵을 가정

이미 라인 교체, Image.Source로 설정 난 그냥 변경을 할 때

Bitmap.Invalidate(); 

가 왜 업데이트되지 것을 그 원본이지만 다른 원본으로 소스를 변경하면 업데이트됩니다.

Image.Source를 이미 설정되어있는 것과 동일한 것으로 설정하는 것은 아무 효과가 없습니다. 가장 복잡한 속성은 기존 값을 변경하지 않는 "변경 사항"을 무시합니다. 새로운 WriteableBitmap을 만들 때마다 매번 작동하기 때문에 (매우 비효율적으로) 작동합니다.

+0

그래서 Win32의 InvalidateRegion과 같은 것이 있습니까? 1 픽셀을 그리려면 전체 이미지를 다시 그릴 필요가 있습니까? 꽤 비효율적 인 것 같습니다. –

+1

보다 효율적인 직접 모드 렌더링을 위해서는 WriteableBitmap 대신 Win2D를 사용하십시오. https://github.com/Microsoft/Win2D –

관련 문제