Как создать обратные маски на CALayers

Я сделаю это как можно проще.

Как создать обратные маски на CALayers в iOS?

У меня есть красный вид и изображение, которое используется для маскировки красного изображения. enter image description here

Я использую свойство маски представления CALayer для применения маски, результат следующий. enter image description here

Однако то, что я желаю, будет противоположным результатом, например (представьте, что белая часть здесь на самом деле является деревом в фоновом режиме, потому что я не очень хорошо разбираюсь в программном обеспечении для редактирования изображений) enter image description here

Другими словами: я хочу, чтобы изображение маскирования пробило отверстие через представление и не выступало в качестве реального слоя маскировки. Ответы как на С# (MonoTouch), так и на Obj-C отлично подходят в любом случае

Ответ 1

Надеюсь, что это полезно

Шаг 1. Создайте маску без альфа-канала.

Шаг 2. Создайте инвертирующую маску следующим методом.

- (UIImage*)createInvertMask:(UIImage *)maskImage withTargetImage:(UIImage *) image {

    CGImageRef maskRef = maskImage.CGImage;

    CGBitmapInfo bitmapInfo = kCGImageAlphaNone;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    CGImageRef mask = CGImageCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGColorSpaceCreateDeviceGray(),
                                    bitmapInfo,
                                    CGImageGetDataProvider(maskRef),
                                    nil, 
                                    NO, 
                                    renderingIntent);


    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);

    CGImageRelease(mask);
    CGImageRelease(maskRef);

    return [UIImage imageWithCGImage:masked];
}

Шаг 3. Установите инвертирующую маску в UIView следующим способом.

- (void)maskWithImage:(UIImage*) maskImage TargetView:(UIView*) targetView {
    CALayer *_maskingLayer = [CALayer layer];
    _maskingLayer.frame = targetView.bounds;
    [_maskingLayer setContents:(id)[maskImage CGImage]];
    [targetView.layer setMask:_maskingLayer];
}

Готово.

Как позвонить?

UIImage* targetImage = [UIImage imageNamed:@"sky_bg.png"];
UIImage* mask = [UIImage imageNamed:@"mask01.png"];

UIImage* invertMask = [self createInvertMask:mask withTargetImage:targetImage];

[self maskWithImage:invertMask TargetView:targetview];

Ответ 2

Вам нужно отменить альфа вашей маски, поэтому "дыры" - это прозрачные пиксели. Вы также захотите растянуть изображение, чтобы покрыть весь красный вид.