2011-11-29 13 views
11

मैं एक ऐसी छवि के साथ काम कर रहा हूं जहां उपयोगकर्ता ने UIBezierPath का उपयोग करके इसका हिस्सा चुना है। मैं उस चयन का हिस्सा नहीं है जो पारदर्शी सब कुछ हटा/साफ़ कर सकता/सकती हूं?पथों के लिए आईओएस 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; 
} 

आप एक से अधिक पथ के मिलन का उपयोग करना चाहते हैं, तो यह मुश्किल है, क्योंकि क्वार्ट्ज किसी भी कार्य करता है कि सीधे दो रास्तों के मिलन की गणना नहीं है। एक तरह से प्रत्येक पथ एक मुखौटा में एक के बाद एक को भरने, और फिर मुखौटा के माध्यम से छवि आकर्षित करने के लिए है:

- (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(); 
संबंधित मुद्दे