2011-11-29 9 views
11

私はUIBezierPathを使用してユーザーがその一部を選択したイメージで作業しています。その選択に含まれていないものをすべて削除/クリア/透明化するにはどうすればよいですか?iOS UIImageをパスにクリップ

答えて

20

1つのパスで非常に簡単です。ただ、クリッピングパスとしてパス設定:あなたは複数のパスの組合を使用したい場合は

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

をクォーツは、直接2つのパスの和集合を計算する任意の機能を持っていないので、それは、難しいです。一つの方法は、マスクに一つによって各パスいずれかを充填し、その後、マスクを介して画像を描画することである。

- (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を1つ持っていれば、これはうまくいきません。 –

+0

申し訳ありませんが、これは実際には機能しません。私は複数のUIBezierPathを持っていますが、必ずしもクリップが望むシェイプを表すのではなく、選択されています。複数のUIBezierPathをクリッピングすると、複数のUIBezierPathが重なって表示され、正しいイメージが返されません。 –

0

I組合複数のパスのコードを試みたが、それは動作しません。

実際には、パスの和集合が重複しない場合、別のパスに1つのパスを追加して最終パスで切り取ります。

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

[originalImg drawAtPoint:CGPointZero]; 
result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
関連する問題