// // UIImage+Masking.m // NYXImagesKit // // Created by @Nyx0uf on 02/06/11. // Copyright 2012 Nyx0uf. All rights reserved. // www.cocoaintheshell.com // #import "UIImage+Masking.h" @implementation UIImage (NYX_Masking) -(UIImage*)maskWithImage:(UIImage*)maskImage { /// Create a bitmap context with valid alpha const size_t originalWidth = (size_t)self.size.width; const size_t originalHeight = (size_t)self.size.height; CGContextRef bmContext = NYXCreateARGBBitmapContext(originalWidth, originalHeight, 0); if (!bmContext) return nil; /// Image quality CGContextSetShouldAntialias(bmContext, true); CGContextSetAllowsAntialiasing(bmContext, true); CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh); /// Image mask CGImageRef cgMaskImage = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate((size_t)maskImage.size.width, (size_t)maskImage.size.height, CGImageGetBitsPerComponent(cgMaskImage), CGImageGetBitsPerPixel(cgMaskImage), CGImageGetBytesPerRow(cgMaskImage), CGImageGetDataProvider(cgMaskImage), NULL, false); /// Draw the original image in the bitmap context const CGRect r = (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = originalWidth, .size.height = originalHeight}; CGContextClipToMask(bmContext, r, cgMaskImage); CGContextDrawImage(bmContext, r, self.CGImage); /// Get the CGImage object CGImageRef imageRefWithAlpha = CGBitmapContextCreateImage(bmContext); /// Apply the mask CGImageRef maskedImageRef = CGImageCreateWithMask(imageRefWithAlpha, mask); UIImage* result = [UIImage imageWithCGImage:maskedImageRef]; /// Cleanup CGImageRelease(maskedImageRef); CGImageRelease(imageRefWithAlpha); CGContextRelease(bmContext); CGImageRelease(mask); return result; } @end