Как создать обратные маски на CALayers - PullRequest
10 голосов
/ 16 ноября 2011

Я сделаю это настолько просто, насколько это возможно.

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 07 марта 2013

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

Шаг 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];
1 голос
/ 02 декабря 2011

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

...