2013-01-17 38 views
1

我想在iOS上覆制CGContextClipToMask的行爲,目前爲止沒有任何運氣。有誰知道CGContextClipToMask是如何在內部工作的?我已經閱讀過文檔,它說它只是將圖像阿爾法值乘以遮罩阿爾法值,所以這就是我在自定義函數中所做的事情,但是當我使用普通的CGContext混合多次繪製結果圖像時,結果會變得越來越暗,而使用CGContextClipToMask則結果是正確的,並且不會變暗。CGContextClipToMask如何在內部工作?

我的理論是CGContextClipToMask以某種方式使用目標上下文,除了圖像和蒙版產生正確的結果,但我只是不知道核心圖形是否足夠。

我也看到了這個問題:

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

並有可能我遇到了這個問題,但後來如何CGContextClipToMask避開精度損失與8位阿爾法的問題?

回答

1

我發現了這個問題。當乘以面具,我不得不做ceilf呼叫RGB值,像這樣:

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:

更多地考慮它,當你寫「乘以面具Alpha值圖像的α值」,有一些東西擊中了我的注意。

事實上,據我所知,iOS上的面具沒有alpha通道,我所有使用alpha通道面具的嘗試都給出了錯誤的結果。這可以讓你進一步移動一下嗎?

也許特技被掩模的圖像乘以(其在灰色顏色空間中定義的,並且已經得到了僅一個分量),並離開該圖像alpha通道不變......

請問是聲音給你?

+0

爲['CGContextClipToMask'(HTTPS GNUstep的代碼: //github.com/gnustep/gnustep-opal/blob/master/Source/OpalGraphics/CGContext.m#L835)在這裏毫無用處... – JustSid

+0

Sergio,沒有該方法的代碼,但它確實有如何評論一個實施可能會奏效。對此有何想法? – jjxtra

+0

其實我不......果汁全都在那個'mask()'函數中...也看看我的編輯。 – sergio