2011-11-29 12 views
11

Sto lavorando con un'immagine in cui l'utente ha selezionato parte di essa utilizzando UIBezierPath. Come posso cancellare/cancellare/rendere trasparente tutto ciò che non fa parte di quella selezione?Clip UII iOS sui percorsi

risposta

20

Con un percorso è molto semplice. Basta impostare il percorso come il tracciato di ritaglio:

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

Se si desidera utilizzare l'unione di più percorsi, è più difficile, perché al quarzo non ha funzioni che calcolano direttamente l'unione di due percorsi. Un modo è quello di riempire ogni percorso uno ad uno in una maschera, e quindi disegnare l'immagine attraverso la maschera:

- (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

Wow. Non avevo idea che fosse così facile. Stavo cercando nei posti sbagliati. Il ritaglio limita l'area di disegno, giusto? –

+0

Huh, ho più nsbezierpaths, o se ho un nsbezierpath in cui i colpi sono uno sopra l'altro questo si fa fregare. –

+0

Siamo spiacenti, questo in realtà non funziona. Ho più UIBezierPath che non rappresentano necessariamente le forme richieste dalla clip, ma le selezioni. Il ritaglio su più UIBezierPath che a volte sono uno sull'altro non restituisce l'immagine corretta. –

0

ho provato il codice di unione percorsi multipli, e non funziona.

In realtà, se l'unione di percorsi non si sovrappongono, si aggiunge un percorso a un altro e si ritaglia con il percorso finale.

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

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