2013-01-17 3 views
1

지금까지 행운없이 iOS에서 CGContextClipToMask의 동작을 복제하려고합니다. 누구 CGContextClipToMask 내부적으로 작동하는 방법을 알고 있습니까? 설명서를 읽었을 때 단순히 이미지 alpha 값에 마스크 알파 값을 곱한다고합니다. 그래서 사용자 정의 함수에서 수행하고있는 작업입니다. 그러나 CGContext에 여러 번 일반 블렌딩을 사용하여 결과 이미지를 그릴 때, 결과는 더 어둡고 어두워지고 CGContextClipToMask를 사용하면 결과가 정확하고 어둡지 않게됩니다.CGContextClipToMask는 내부적으로 어떻게 작동합니까?

내 이론에 따르면 CGContextClipToMask는 이미지와 마스크 이외에 올바른 결과를 생성하기 위해 어떻게 든 목적지 컨텍스트를 사용하지만, 코어 그래픽에 대해서는 충분히 알지 못한다.

나는 또한이 질문에 읽었습니다 :

How to get the real RGBA or ARGB color values without premultiplied alpha?

을 그리고 내가이 문제에 실행하고 가능하지만, 다음 방법 CGContextClipToMask 8 비트 알파 정밀 손실의 문제를 해결 나올까요?

답변

1

문제점을 발견했습니다. 마스크를 곱하면, 그래서 같은 RGB 값에 ceilf 통화를 수행했다 :

float alphaPercent = (float)maskAlpha/255.0f; 
pixelDest->A = maskAlpha; 
pixelDest->R = ceilf((float)pixelDest->R * alphaPercent); 
pixelDest->G = ceilf((float)pixelDest->G * alphaPercent); 
pixelDest->B = ceilf((float)pixelDest->B * alphaPercent); 

놀랍게도,이 문제를 해결 ...

0

저는 개인적으로 CGContextClipToMask의 내부 구조에 대해 전혀 알지 못하지만, GNUStep에서 어떻게 구현되는지 살펴봄으로써 흥미로운 것을 찾을 수 있습니다.

PS : 당신이 쓸 때

이 그것에 대해 더 많은 생각이 내 관심을 치는 무언가가있다 "마스크 알파 값에 의해 이미지의 알파 값을 곱합니다."

실제로 내가 아는 한, iOS의 마스크에는 알파 채널이 없으며 알파 채널 마스크를 사용하려는 모든 시도에서 잘못된 결과가 나타납니다. 이렇게하면 조금 더 움직일 수 있습니까?

는 아마 트릭

방법 소리 것을 않습니다 (회색 색 공간에서 정의되며, 하나 개의 구성 요소를 가지고있는) 마스크에 의해 이미지를 곱한 변경 이미지의 알파 채널을두고있다 너에게?

+0

['CGContextClipToMask' (HTTPS의 그누 스텝 번호 : //github.com/gnustep/gnustep-opal/blob/master/Source/OpalGraphics/CGContext.m#L835) 여기 오히려 쓸모가 없다 ... – JustSid

+0

세르지오, 그 방법에 대한 코드가 없지만 코멘트 aout 방법이있다 구현이 효과가있을 수 있습니다. 그것에 관한 어떤 생각? – jjxtra

+0

사실 나는 주스가 모두'mask()'함수에 있습니다 ... 또한 제 편집을 봅니다. – sergio