2015-01-06 2 views
0

선을 그려야하는 앱을 개발 중입니다. 사용자가 손가락을 움직일 때마다 그 점이 패스에 추가되고 아래 예제처럼 CGContext에 추가됩니다.패스를 다른 색상으로 똑같이 다시 획 처리하는 방법은 무엇입니까?

CGContextMoveToPoint(cacheContext, point1.x, point1.y); 
CGContextAddCurveToPoint(cacheContext, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, point2.x, point2.y); 
CGPathMoveToPoint(path, NULL, point1.x, point1.y); 
CGPathAddCurveToPoint(path, NULL, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, point2.x, point2.y); 

는 지금은 검은 색에 뇌졸중을 추가 할 때이 시간을 쓰다됩니다 라인이 그려진 한 후 약간 작아집니다 그러나 다음 코드

CGContextSetStrokeColorWithColor([UIColor blackcolor].CGColor) 
CGContextAddPath(cacheContext,path); 
CGContextStrokePath(cacheContext); 

에게 사용 전에. 이렇게하면 선이 그어진 경로 주위에 약간의 경계가 생깁니다. 그래서 내 질문은 : 어떻게 내가 stroced 경로 CGcontext 그려진 경로 동일하게 얻을 수 있습니까?

답변

3

문제는 앤티 앨리어싱 때문입니다. 경로는 기하학적 인 이상입니다. 주어진 너비, 색상 등으로 경로를 쓰다듬어 생성 한 비트 맵은 불완전합니다. 이상적인 모양은 일부 픽셀을 완전히 덮지 만 다른 부분은 부분적으로 만 덮습니다.

앤티 앨리어싱이없는 경우 (그리고 불투명 한 색상이라고 가정)는 대부분 이상적인 모양 안에있는 픽셀을 완전히 칠하고 대부분 외부에있는 픽셀에는 손대지 않는 것입니다. 수직 또는 수평선 이외에는 눈에 띄지 않는 톱니 모양이 남습니다. 나중에 동일한 획 매개 변수를 사용하여 같은 경로를 다시 그릴 경우 똑같은 픽셀이 영향을 받고 완전히 칠해지기 때문에 이전 도면을 새 것으로 완전히 대체 할 수 있습니다.

앤티 앨리어싱을 사용하면 이상적인 모양 안에 부분적으로 만있는 모든 픽셀이 새 색상으로 완전히 칠 해지 지 않습니다. 오히려 획 색상은 이상적인 모양 안에있는 픽셀의 비율에 비례하여 적용됩니다. 해당 픽셀에 이미있는 색은 반비례로 유지됩니다. 예를 들어 이상적인 모양의 43 % 인 픽셀은 획 색상의 43 %와 이전 색상의 57 %의 색상을 얻습니다.

즉, 경로를 두 번째 다른 색상으로 쓰다듬어도 이전 획의 색상이 완전히 대체되지는 않습니다. 흰색으로 비트 맵을 채운 다음 경로를 빨간색으로 칠하면 가장자리에있는 픽셀 중 일부가 약간 빨간색을 섞어 밝은 빨간색 또는 분홍색이됩니다. 그 경로를 파란색으로 선을 그으면 가장자리의 픽셀은 밝은 파랑 또는 분홍색 인 약간의 파란색과 약간의 색상이 혼합됩니다. 그러면 마젠타 색이됩니다.

CGContextSetShouldAntialias()을 사용하여 앤티 앨리어싱을 비활성화 할 수 있지만 톱니 모양이 될 위험이 있습니다. 경로의 두 스트로크에서이 작업을 수행해야합니다.

또는 경로를 다시 그리기 전에 배경색을 지울 수 있습니다. 그러나이를 위해서는 표시하려는 모든 것을 완전히 다시 그릴 수 있어야합니다.

관련 문제