2009-08-30 87 views
3

在我的iPhone應用程序中,我需要讓用戶通過給定的動態生成的CGPath來剪輯用戶提供的UIImageiPhone:由給定的CGPath剪輯用戶提供的UIImage

所有在給定(關閉)CGPath以外的部分都應該剪掉,並且生成的圖像應該用路徑的邊界矩形修剪。

圖像應該用軟邊框裁剪。也就是說,剪切路徑邊緣的alpha通道應該有一個軟梯度,從透明像素到不透明像素。

是否有任何可用的解決方案來實現描述效果?

主要問題是如何獲得軟梯度。我想我的CGPath柵格化到掩膜並在柵格化後模糊它,但我沒有發現任何有關iPhone API模糊的問題。關於裁剪,我打算使用CGPathGetBoundingBox數據,但重新閱讀文檔告訴我,由此產生的邊界框會包含Bézier和二次曲線的控制點,這對我來說是不可接受的。那麼,對於非零alpha像素的舊圖像掃描應該完成這項工作。

+0

如果你需要一個軟梯度,你需要一個像面具了。給定的路徑是固定的還是動態生成的? – hatfinch 2009-08-30 23:19:54

+0

給定路徑是動態生成的。我已經更新了答案。 – 2009-08-31 06:37:32

+0

呃,我的意思是,更新了當然的問題:-) – 2009-08-31 14:17:07

回答

0

對於邊界框,使用CGPathGetPathBoundingBox,它不包含控制點。

你會在CoreImage中找到過濾(如模糊)。

基本CoreImage過濾器的使用(從https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101

CIContext *context = [CIContext contextWithOptions:nil]; 
CIImage *image = [CIImage imageWithContentsOfURL:myURL]; 
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"]; 
[filter setValue:image forKey:kCIInputImageKey]; 
[filter setValue:@0.8f forKey:kCIInputIntensityKey]; 
CIImage *result = [filter valueForKey:kCIOutputImageKey]; 
CGRect extent = [result extent]; 
CGImageRef cgImage = [context createCGImage:result fromRect:extent]; 

過濾器:

https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP40004346