2011-11-29 89 views
11

我正在處理圖像,其中用戶使用UIBezierPath選擇了它的一部分。我如何刪除/清除/透明化所有不屬於該選擇範圍的內容?iOS UIImage剪輯到路徑

回答

20

通過一條路徑,它非常簡單。剛剛成立的路徑爲剪貼路徑:如果你想使用多路徑工會

- (UIImage *)maskImage:(UIImage *)originalImage toPath:(UIBezierPath *)path { 
    UIGraphicsBeginImageContextWithOptions(originalImage.size, NO, 0); 
    [path addClip]; 
    [originalImage drawAtPoint:CGPointZero]; 
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return maskedImage; 
} 

,它很難,因爲Quartz不具有直接計算的兩條路徑工會的任何功能。一種方法是將每條路徑逐個填充到蒙版中,然後通過蒙版繪製圖像:

- (UIImage *)maskedImage 
{ 
    CGRect rect = CGRectZero; 
    rect.size = self.originalImage.size; 
    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0); { 
     [[UIColor blackColor] setFill]; 
     UIRectFill(rect); 
     [[UIColor whiteColor] setFill]; 
     for (UIBezierPath *path in self.paths) 
      [path fill]; 
    } 
    UIImage *mask = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); { 
     CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage); 
     [self.originalImage drawAtPoint:CGPointZero]; 
    } 
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return maskedImage; 
} 
+0

哇。不知道這很容易。我正在尋找所有錯誤的地方。剪切限制了繪圖區域,對吧? –

+0

呵呵,我有多個nsbezierpaths,或者如果我有一個nsbezierpath,筆劃在彼此之上,這會被搞砸。 –

+0

對不起,這實際上不起作用。我有多個UIBezierPath,它們不一定代表剪輯需要的形狀,但是可以選擇。在多個UIBezierPaths上裁剪,有時會超過另一個,不會返回正確的圖像。 –

0

我試過聯合多個路徑的代碼,它不起作用。

實際上,如果路徑的聯合不會彼此重疊,我們會將一條路徑附加到另一條路徑上並使用最終路徑裁剪。

UIGraphicsBeginImageContextWithOptions(originalImg.size, NO, 0); 
[path1 appendPath:path2]; // append path2 to path1 
[path1 addClip]; 

[originalImg drawAtPoint:CGPointZero]; 
result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();