Маскирование изображений позволяет разработчику создавать изображения произвольной формы. Маскирование изображений позволяет создавать более впечатлительные и менее скучные интерфейсы.
Давайте посмотрим на пример на картинке и сделаем маскирование для Mac и iOS.
Итак, создание маски — очень простая задача, используя Core Graphics. Следующая функция берет два изображения и использует одно для маскирования другого.
Для NSImage
- (NSImage*)maskImage:(NSImage *)image withMask:(NSImage *)myMaskImage { CGImageSourceRef imageSource; imageSource = CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation], NULL); CGImageRef imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); CGImageSourceRef maskSource; maskSource = CGImageSourceCreateWithData((CFDataRef)[myMaskImage TIFFRepresentation], NULL); CGImageRef maskRef = CGImageSourceCreateImageAtIndex(maskSource, 0, NULL); CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask(imageRef, mask); NSImage *maskedImage = [[NSImage alloc] initWithCGImage:masked size:CGSizeMake(CGImageGetWidth(masked), CGImageGetHeight(masked))]; return maskedImage; }
Для UIImage
- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); return [UIImage imageWithCGImage:masked]; }
Все! Очень просто.
ВАЖНО: Маска не должна иметь никакой прозрачности!
Желаю удачи!