
Маскирование изображений позволяет разработчику создавать изображения произвольной формы. Маскирование изображений позволяет создавать более впечатлительные и менее скучные интерфейсы.
Давайте посмотрим на пример на картинке и сделаем маскирование для 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];
}Все! Очень просто.
ВАЖНО: Маска не должна иметь никакой прозрачности!
Желаю удачи!
