104 votes

Comment masquer une UIImageView ?

J'essaie de masquer une image avec quelque chose comme ceci :

image to be masked

Pouvez-vous m'aider ?

J'utilise ce code :

- (void) viewDidLoad {
    UIImage *OrigImage = [UIImage imageNamed:@"dogs.png"];
    UIImage *mask = [UIImage imageNamed:@"mask.png"];
    UIImage *maskedImage = [self maskImage:OrigImage withMask:mask];
    myUIIMage.image = maskedImage;
}

28 votes

Je suis la personne qui a écrit le tutoriel original. L'image du masque est juste une simple image en niveaux de gris que j'ai créée dans Photoshop. Rien de spécial à ce sujet. La zone noire devient la partie "transparente" du masque. Gardez à l'esprit que toute nuance de gris est interprétée comme un degré d'opacité. De cette manière, les masques peuvent également être des dégradés, ce qui est utile pour créer des bordures plus douces autour d'un masque.

0 votes

Ça doit être de la même taille, non ?

0 votes

Code hyper-élégant, merci. juste un lien utile si quelqu'un a besoin de recadrer une image avant de la masquer... stackoverflow.com/questions/17712797/

9voto

Safad Funy Points 1586

SWIFT 3 XCODE 8.1

func maskImage(image: UIImage, withMask maskImage: UIImage) -> UIImage {

    let maskRef = maskImage.cgImage

    let mask = CGImage(
        maskWidth: maskRef!.width,
        height: maskRef!.height,
        bitsPerComponent: maskRef!.bitsPerComponent,
        bitsPerPixel: maskRef!.bitsPerPixel,
        bytesPerRow: maskRef!.bytesPerRow,
        provider: maskRef!.dataProvider!,
        decode: nil,
        shouldInterpolate: false)

    let masked = image.cgImage!.masking(mask!)
    let maskedImage = UIImage(cgImage: masked!)

    // No need to release. Core Foundation objects are automatically memory managed.

    return maskedImage

}

// pour utilisation

testImage.image = maskImage(image: UIImage(named: "OriginalImage")!, withMask: UIImage(named: "maskImage")!)

3voto

Juan Valera Points 94

Version rapide de la solution acceptée :

func maskImage(image: UIImage, withMask maskImage: UIImage) -> UIImage {

    let maskRef = maskImage.CGImage

    let mask = CGImageMaskCreate(
        CGImageGetWidth(maskRef),
        CGImageGetHeight(maskRef),
        CGImageGetBitsPerComponent(maskRef),
        CGImageGetBitsPerPixel(maskRef),
        CGImageGetBytesPerRow(maskRef),
        CGImageGetDataProvider(maskRef),
        nil,
        false)

    let masked = CGImageCreateWithMask(image.CGImage, mask)
    let maskedImage = UIImage(CGImage: masked)!

    // No need to release. Core Foundation objects are automatically memory managed.

    return maskedImage

}

Juste au cas où quelqu'un en aurait besoin.

Ça marche pour moi sans problème.

2voto

itruf Points 521

Nous avons constaté que la réponse correcte ne fonctionne pas maintenant et nous avons implémenté une petite classe qui permet de masquer n'importe quelle image dans UIImageView.

Il est disponible ici : https://github.com/Werbary/WBMaskedImageView

Exemple :

WBMaskedImageView *imgView = [[WBMaskedImageView alloc] initWithFrame:frame];
imgView.originalImage = [UIImage imageNamed:@"original_image.png"];
imgView.maskImage = [UIImage imageNamed:@"mask_image.png"];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X