Skip to content

Instantly share code, notes, and snippets.

@lamprosg
Last active May 26, 2022 15:29
Show Gist options
  • Save lamprosg/72d09bdc70a91585b5ab to your computer and use it in GitHub Desktop.
Save lamprosg/72d09bdc70a91585b5ab to your computer and use it in GitHub Desktop.
(iOS) Image masking Objective-C / Swift
//http://www.innofied.com/implementing-image-masking-in-ios/
- (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;
}
//USE
UIImage *image=[UIImage imageNamed:@"image2.png"];
UIImage *mask=[UIImage imageNamed:@"mask6.png"];
UIImage *newimage=[self maskImage:image withMask:mask];
self.imageView.image=newimage;
Swift
func maskImage(image:UIImage, mask:(UIImage))->UIImage{
let imageReference = image.CGImage
let maskReference = mask.CGImage
let imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference),
CGImageGetHeight(maskReference),
CGImageGetBitsPerComponent(maskReference),
CGImageGetBitsPerPixel(maskReference),
CGImageGetBytesPerRow(maskReference),
CGImageGetDataProvider(maskReference), nil, true)
let maskedReference = CGImageCreateWithMask(imageReference, imageMask)
let maskedImage = UIImage(CGImage:maskedReference!)
return maskedImage
}
//USE
let image = UIImage(named: "image2.png")
let maskingImage = UIImage(named: "mask6.png")
imageView.image = maskImage(image!, mask: maskingImage!)
@ahmedsafadii
Copy link

SWIFT 3

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

}

@DanielZanchi
Copy link

not working 😟 in Swift

@HEYRIX
Copy link

HEYRIX commented May 26, 2022

func drawMaskImage(_ mask:UIImage) -> UIImage? {
        guard let imageReference = self.cgImage else { return nil };
        let maskReference = mask.cgImage;
        if let maskReference = maskReference {
            let imageMask = CGImage(maskWidth: maskReference.width,
                                    height: maskReference.height,
                                    bitsPerComponent: maskReference.bitsPerComponent,
                                    bitsPerPixel: maskReference.bitsPerPixel,
                                    bytesPerRow: maskReference.bytesPerRow,
                                    provider: maskReference.dataProvider!,
                                    decode: nil, shouldInterpolate: true)
               
            let maskedReference = imageReference.masking(imageMask!)
            let maskedImage = UIImage(cgImage:maskedReference!)
            return maskedImage
        }
        return nil;
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment