2009-08-30 9 views
3

Dans mon application iPhone, je dois laisser l'utilisateur à clip UIImage fourni par l'utilisateur CGPath donné dynamiquement. Tout ce qui est à l'extérieur donné (fermé) CGPath devrait être découpé, et l'image résultante devrait être découpée par le rectangle de délimitation du chemin.iPhone: Clip UIImage fourni par l'utilisateur par un CGPath

L'image doit être coupée avec une bordure douce. C'est-à-dire, il devrait y avoir un léger gradient dans le canal alpha sur le bord du chemin de détourage, des pixels transparents aux pixels opaques.

Existe-t-il une solution disponible pour obtenir l'effet décrit?

Le problème principal est comment obtenir ce dégradé doux. J'ai pensé à rasteriser mon CGPath au masque et le rendre flou après qu'il ait été pixellisé, mais je n'ai rien trouvé concernant le flou dans l'API iPhone & hellip; En ce qui concerne l'écrêtage, j'ai prévu d'utiliser les données CGPathGetBoundingBox, mais la relecture de la documentation m'indique que la boîte englobante résultante inclurait des points de contrôle pour les courbes de Bézier et quadratiques, ce qui n'est pas acceptable pour moi. Eh bien, le bon vieux balayage de l'image pour les pixels alpha non-zéro devrait faire le travail à la place.

+0

Si vous avez besoin d'un gradient doux, vous aurez besoin d'un masque d'image aussi. Le chemin donné est-il fixé ou généré dynamiquement? – hatfinch

+0

Le chemin donné est généré dynamiquement. J'ai mis à jour la réponse. –

+0

Er, je veux dire, mis à jour la question bien sûr :-) –

Répondre

0

Pour la zone de délimitation, utilisez CGPathGetPathBoundingBox, qui n'inclut pas les points de contrôle.

Vous trouverez le filtrage (comme les flous) dans CoreImage.

Utilisation de base du filtre CoreImage (de 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]; 

Filtres:

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

Questions connexes