문제

.net(또는 GDI+ 전체)의 LinearGradientBrush에는 심각한 버그가 있는 것 같습니다.때로는 아티팩트를 소개하기도 합니다.(보다 여기 또는 여기 - 기본적으로 선형 그래디언트의 첫 번째 선은 최종 색상으로 그려집니다.흰색에서 검정색으로의 그라데이션은 검정색 선으로 시작한 다음 적절한 흰색에서 검정색 그라데이션으로 시작됩니다)

누군가 이에 대한 해결 방법을 찾았는지 궁금합니다.정말 짜증나는 버그네요 :-(

다음은 아티팩트의 그림입니다. 2개의 LinearGradientBrush가 있습니다.

대체 텍스트 http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

도움이 되었습니까?

해결책

그라디언트 브러시를 사용할 때도 이 점을 발견했습니다.내가 가진 유일한 효과적인 해결 방법은 항상 칠할 영역보다 모든 가장자리에서 1픽셀 더 큰 그라디언트 브러시 직사각형을 만드는 것입니다.그러면 네 가장자리 모두에서 발생하는 문제로부터 사용자를 보호할 수 있습니다.단점은 가장자리에 사용된 색상이 사용자가 지정한 색상보다 훨씬 적다는 것입니다. 그러나 이는 드로잉 아티팩트 문제보다 낫습니다!

다른 팁

더 큰 버전을 얻으려면 직사각형에 멋진 Inflate(int i) 메서드를 사용할 수 있습니다.

위의 Phil의 답변을 기교적으로 설명하겠습니다. (이것은 실제로 설명이지만 해당 권한이 없습니다.)내가 본 행동은 반대입니다 문서, 내용은 다음과 같습니다.

시작선은 방향선과 수직이며 직사각형의 모서리 중 하나를 통과합니다.출발선의 모든 점은 출발색입니다.그런 다음 끝선은 방향선에 수직이고 직사각형의 모서리 중 하나를 통과합니다.끝 라인의 모든 점은 끝 색상입니다.

즉, 어떤 경우에는 단일 픽셀 랩 어라운드를 얻습니다.내가 알 수 있는 한(실험을 통해) 직사각형의 너비나 높이가 이상한 경우에만 문제가 발생합니다.따라서 버그를 해결하려면 치수(확장 전)가 홀수인 경우에만 LinearGradientBrush 사각형을 1픽셀씩 늘리는 것이 적절하다는 것을 알았습니다.즉, 항상 브러시 직사각형을 너비와 높이 모두에서 다음 짝수 픽셀만큼 반올림합니다.

그래서 직사각형을 채우려면 r 나는 다음과 같은 것을 사용합니다 :

Rectangle gradientRect = r;
if (r.Width % 2 == 1)
{
    gradientRect.Width += 1;
}
if (r.Height % 2 == 1)
{
    gradientRect.Height += 1;
}
var lgb = new LinearGradientBrush(gradientRect, startCol, endCol, angle);
graphics.FillRectangle(lgb, r);

미쳤지 만 사실입니다.

적어도 WPF를 사용하면 사용해 볼 수 있습니다 GradientStop덧칠하는 경우에도 가장자리에서 100% 정확한 색상을 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top