UIImage+Masking.m 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. //
  2. // UIImage+Masking.m
  3. // NYXImagesKit
  4. //
  5. // Created by @Nyx0uf on 02/06/11.
  6. // Copyright 2012 Nyx0uf. All rights reserved.
  7. // www.cocoaintheshell.com
  8. //
  9. #import "UIImage+Masking.h"
  10. @implementation UIImage (NYX_Masking)
  11. -(UIImage*)maskWithImage:(UIImage*)maskImage
  12. {
  13. /// Create a bitmap context with valid alpha
  14. const size_t originalWidth = (size_t)self.size.width;
  15. const size_t originalHeight = (size_t)self.size.height;
  16. CGContextRef bmContext = NYXCreateARGBBitmapContext(originalWidth, originalHeight, 0);
  17. if (!bmContext)
  18. return nil;
  19. /// Image quality
  20. CGContextSetShouldAntialias(bmContext, true);
  21. CGContextSetAllowsAntialiasing(bmContext, true);
  22. CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh);
  23. /// Image mask
  24. CGImageRef cgMaskImage = maskImage.CGImage;
  25. CGImageRef mask = CGImageMaskCreate((size_t)maskImage.size.width, (size_t)maskImage.size.height, CGImageGetBitsPerComponent(cgMaskImage), CGImageGetBitsPerPixel(cgMaskImage), CGImageGetBytesPerRow(cgMaskImage), CGImageGetDataProvider(cgMaskImage), NULL, false);
  26. /// Draw the original image in the bitmap context
  27. const CGRect r = (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = originalWidth, .size.height = originalHeight};
  28. CGContextClipToMask(bmContext, r, cgMaskImage);
  29. CGContextDrawImage(bmContext, r, self.CGImage);
  30. /// Get the CGImage object
  31. CGImageRef imageRefWithAlpha = CGBitmapContextCreateImage(bmContext);
  32. /// Apply the mask
  33. CGImageRef maskedImageRef = CGImageCreateWithMask(imageRefWithAlpha, mask);
  34. UIImage* result = [UIImage imageWithCGImage:maskedImageRef];
  35. /// Cleanup
  36. CGImageRelease(maskedImageRef);
  37. CGImageRelease(imageRefWithAlpha);
  38. CGContextRelease(bmContext);
  39. CGImageRelease(mask);
  40. return result;
  41. }
  42. @end