2014-11-14 56 views
0

我想使用CGContextClip()做了一些拉伸,但是我遇到了一些奇怪的抗鋸齒問題。問題似乎是,填充與正在替換的顏色混合在一起,而不是周圍的像素。請參閱圖像以獲得對問題的更好描述!問題的核芯顯卡:CGContextClip()邊緣不需要怪異抗鋸齒

實施例:

enter image description here

(注意,藍色邊緣被正確抗鋸齒)

怪異抗鋸齒邊緣:

enter image description here (邊緣應該是與白色混合,不是藍色)

代碼:

-(void) drawRect:(CGRect)rect { 

    CGContextRef c = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(c); 
    { 

     CGContextBeginPath(c); 
     CGContextAddEllipseInRect(c, CGRectMake(25, 25, 200, 200)); 
     CGContextClosePath(c); 
     CGContextClip(c); 

     CGContextSetFillColorWithColor(c, [UIColor blueColor].CGColor); 
     CGContextFillRect(c, rect); 

     CGContextSetFillColorWithColor(c, [UIColor redColor].CGColor); 
     CGContextFillRect(c, CGRectMake(0, 0, 250, 125)); 

    } 
    CGContextRestoreGState(c); 


} 

如何防止這種怪異的抗鋸齒任何想法?我無法禁用它,因爲圓形邊緣仍然需要抗鋸齒!

只是要清楚,這僅僅是一個例子。我試圖在一個更加複雜的形狀上解決這個問題,在這種情況下,僅僅填充一半剪輯的解決方案是不可能的!

+0

嘗試用藍色填充矩形的一半。紅色下面是藍色,所以CG所做的是正確的...... – QED 2014-11-14 21:22:29

+0

這可能會解決這個問題,但這不是我可以應用於其他任何方法的解決方案!隨着更復雜的形狀,這是不可能的。對不起,我應該在OP中明確指出,我正在嘗試解決這個問題,但我只是爲了簡單起見而用這個例子來演示它。我將編輯OP。 – Hamish 2014-11-14 21:25:19

+0

另外,這絕對不是正確的行爲!如果紅色填充沒有完全覆蓋藍色背景(即,如果圍繞該圓圈有1px的藍色邊緣),但它確實有意義。如果關閉抗鋸齒功能,紅色將佔據整個圓的上半部分 – Hamish 2014-11-14 21:29:06

回答

0

好了,這不100%解決問題,但它通過相當數量的減少怪異抗鋸齒。我從this question得到了想法。這個想法是,在繪製之前清除要繪製的區域中的任何先前渲染,方法是將混合模式更改爲清除,執行繪圖,然後將其切換回正常,然後重新繪製。修改後的代碼看起來是這樣的:

-(void) drawRect:(CGRect)rect { 

    CGContextRef c = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(c); 
    { 

     CGContextBeginPath(c); 
     CGContextAddEllipseInRect(c, CGRectMake(25, 25, 200, 200)); 
     CGContextClosePath(c); 
     CGContextClip(c); 

     CGContextSetFillColorWithColor(c, [UIColor blueColor].CGColor); 
     CGContextFillRect(c, CGRectMake(25, 25, 200, 200)); 

     CGContextSetFillColorWithColor(c, [UIColor redColor].CGColor); 
     CGRect r = CGRectMake(0, 0, 250, 125); 

     CGContextSetBlendMode(c, kCGBlendModeClear); 
     CGContextFillRect(c, r); 
     CGContextSetBlendMode(c, kCGBlendModeNormal); 
     CGContextFillRect(c, r); 


    } 
    CGContextRestoreGState(c); 

} 

如果有人想出了一個更好的解決方案,100%修復了這個問題,然後發佈它作爲一個答案,我會接受!

+0

我看到這是非常古老的,所以你可能已經很長時間了。我是一個新手,與這些東西混在一起,但我注意到你的代碼對筆畫顏色或線條寬度沒有任何作用。是否有可能只是設置這些(顏色匹配的填充,或寬度爲0.0)將解決這個問題? – user1272965 2017-07-29 15:01:07