imagemask

Маскирование изображений позволяет разработчику создавать изображения произвольной формы. Маскирование изображений позволяет создавать более впечатлительные и менее скучные интерфейсы.

Давайте посмотрим на пример на картинке и сделаем маскирование для 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];
}

Все! Очень просто.

ВАЖНО: Маска не должна иметь никакой прозрачности!

github

Желаю удачи!