12
votes

masquer un uiimage

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.

Quelle est la meilleure façon de faire cela?

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?


0 commentaires

4 Réponses :


3
votes

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 (que ces méthodes graphiques principales utilisent) à partir d'un objet uIImage via son cgimage propriété, puis obtenez un UiImage de votre modification (masqué) cgimageref à l'aide de l'uIImage méthode de classe + imagewithcgimage: . .


1 commentaires

CCIMAGE D'UN UIIMAGE EST NULL si cela a été créé à partir d'un CIIMAGE, soyez donc prudent.



25
votes

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);


2 commentaires

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 comme votre seconde.


Nécessaire pour mettre à jour imagewithcgimage: à imagewithcgimage: échelle: orientation:



6
votes

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;
}


2 commentaires

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é.



0
votes

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é.

Comment récolter l'uImage forme ovale ou forme de cercle?


0 commentaires