Je travaille sur une application pouvant changer les frontières ou un uiImage rectangulaire. Les frontières varieront, mais on dira que l'uiimage a été coupé avec des ciseaux, ou quelque chose à cet effet. P>
Quelle est la meilleure façon de faire cela? P>
Ma première pensée est de préparer un groupe de PNG transparentes avec l'effet frontière correct que je recherche, puis utilisez-la en quelque sorte comme un masque pour mon uiimage. Est-ce le bon chemin? Ou existe-t-il une façon de faire une manière programmatique plus flexible de faire cela? P>
4 Réponses :
Oui, c'est à peu près ce que vous devez faire. La meilleure approche consiste à utiliser des graphiques principaux; Le guide de programmation de quartz 2D a un article décrivant comment masquer des images avec d'autres images . Vous pouvez obtenir un cgimageref code> (que ces méthodes graphiques principales utilisent) à partir d'un objet
uIImage code> via son
cgimage code> propriété, puis obtenez un
UiImage code> de votre modification (masqué)
cgimageref code> à l'aide de l'uIImage code> méthode de classe code> + imagewithcgimage: code>. P>.
CCIMAGE D'UN UIIMAGE EST NULL si cela a été créé à partir d'un CIIMAGE, soyez donc prudent.
Voici les appels graphiques principaux que vous pouvez utiliser pour masquer l'image:
//Mask Image UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"]; CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask); CGImageRelease(mask); UIImage *maskedImage = [UIImage imageWithCGImage:masked]; CGImageRelease(masked);
MERCI! Je me demandais comment faire cela. Pour la postérité, il y a une petite faute de frappe dans votre premier UIImage Alloc: Devrait dire Imagenamed code> comme votre seconde.
Nécessaire pour mettre à jour imagewithcgimage: code> à
imagewithcgimage: échelle: orientation: code>
Vous avez besoin d'un masquage de l'image pour cela, j'ai écrit un Tutoriel sur la façon de l'utiliser et comment je l'ai utilisé dans mon propre application.
L'exemple suivant Le code doit vous aider à démarrer, il a besoin de l'image d'origine et d'une image de masque comme entrée et renvoie l'image masquée comme sortie. P>
- (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask { CGImageRef imageReference = image.CGImage; CGImageRef maskReference = mask.CGImage; CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), CGImageGetHeight(maskReference), CGImageGetBitsPerComponent(maskReference), CGImageGetBitsPerPixel(maskReference), CGImageGetBytesPerRow(maskReference), CGImageGetDataProvider(maskReference), NULL, // Decode is null YES // Should interpolate ); CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask); CGImageRelease(imageMask); UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; CGImageRelease(maskedReference); return maskedImage; }
J'ai regardé dessus cela, et malheureusement, je ne peux tout simplement pas le faire travailler. Je mettais l'image dans le premier paramètre que l'image B & B dans la seconde, à la fois la même taille, et la sortie est exactement la même que la première image.
Votre lien de tutoriel est cassé.
Il y a une autre façon de le faire avec un chemin. J'ai posté du code qui le fait avec un cercle et pourrait facilement être édité pour travailler avec n'importe quel chemin fermé. P>
Comment récolter l'uImage forme ovale ou forme de cercle? p>