2011-02-06 3 views
6

System.Drawing.Graphics 클래스에는 CompositionMode라는 속성이 있습니다. 두 가지 옵션이 있습니다. SourceOver (알파 구성 요소를 기반으로하며 이미 배경이 그려지는 모든 요소를 ​​혼합 함) 또는 그려지는 무엇이든 단순히 배경을 덮어 쓰는 SourceCopy입니다.WPF에서 알파 블렌드 모드를 변경 하시겠습니까?

WPF에도 비슷한 것이 있습니까?

WPF에서는 예를 들어 다른 PolyLine 위에 다른 PolyLine을 그릴 때 항상 새 PolyLine이 배경과 함께 알파 블렌드됩니다. 나는 그것이 사용되는 컨테이너와 독립적이라고 생각한다. 캔버스를 사용하고 있지만 블렌드 모드 속성을 찾을 수 없습니다. 내가하고 싶은 것은 위에서 언급 한 SourceCopy compositionmode가하는 일입니다. 나는. 새로운 PolyLine은 캔버스에 이미있는 것을 덮어 씁니다.

Canvas backbuffer에 액세스 할 수 없어 픽셀 쉐이더를 사용하는 것만 큼 간단한 방법이 있습니다.

캔버스가 붙어 있지 않고 덮어 쓰기 모드를 지원하는 컨테이너를 사용해도됩니다.

현재 System.Drawing.Graphics 컨텍스트를 얻은 CompositionMode를 처리 할 수있는 WriteableBitmap을 기반으로하는 솔루션이 있습니다. 그것은 작동하지만 내 윈도우가 전체 화면이므로 솔루션에 심각한 성능상의 영향이 있습니다.

설명 및 예 : WPF 창은 완전히 투명하며 Canvas (배경색 (0,0,0,0))도 마찬가지입니다. 이제 Color.FromArgb (128,128,0,0)를 사용하여 PolyLine을 그립니다. 이제 반투명 빨간색 폴리 라인이 생겼습니다. 다음으로 Color.FromArgb (0,0,0,0)을 사용하여 동일한 PolyLine을 그립니다. 알파 블렌딩이 일어나기 때문에 결과는 이전과 같습니다. 그러나 내가 원하는 것은 두 번째 폴리 라인으로 빨간색 폴리선이 지워진다는 것입니다 (그래픽 클래스의 SourceCopy 모드가 정확히 수행하는 것입니다).

답변

0

나는 당신이해야 할 일은 PolyLine가 완전히 불투명 한 알파 값이 스트로크/채우기 (예 255을). 그런 다음 배경으로 혼합 할 수 없습니다.

+1

그래,하지만 배경을 모든 알파 값으로 덮어 씁니다. 예를 들어 방금 질문에 추가했습니다. – Harald

0

당신은 클리핑 마스크를 적용 할 수있는 요소를 통해 클립하는 경로를 제공 할 수있는이 방법이 그 아래에 있지만 많은 요소들이 클리핑 될 필요가 있기 때문에 유지하기가 어려울 수도 있습니다 ...

+0

WritableBitmap을 사용하는 현재 솔루션에서는 (AddDirtyRect를 통해) 클리핑 rect를 적용합니다. – Harald

관련 문제