ios - 如何在 CALayers 上创建反向蒙版

标签 ios image xamarin.ios calayer mask

我会尽可能简单。

如何在 iOS 中的 CALayers 上创建反转蒙版?

我有一个红色 View 和一个用于遮盖红色 View 的图像。 enter image description here

我使用 View 的 CALayer 的 mask 属性应用蒙版,结果如下。 enter image description here

然而我想要的是相反的结果,比如 (假设这里的白色部分实际上是背景中的木头,因为我不太会修图软件) enter image description here

换句话说:我希望 mask 图像在 View 中打一个洞,而不是充当实际的 mask 层。 C# (MonoTouch) 或 Obj-C 的答案都很好

最佳答案

希望对你有帮助

第 1 步:创建一个没有任何 alpha channel 的 mask 。

第 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];

关于ios - 如何在 CALayers 上创建反向蒙版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8155412/

相关文章:

c# - MonoTouch - LLVM 编译的 App 在 5.3.x 的 System.Collections.Generic.Dictionary 中挂起?

ios - CallKit 在 iOS 中处理多个调用(VOIP 和 GSM)问题

ios - ' fatal error : NSCoder not supported' when using UIViewController

ios - 自定义 plist 文件中的变量

ios - SwiftUI, 在工具栏中,菜单和按钮的标签图像大小不同

php - 通过内容类型为 image Yii 的 php 文件显示图像

javascript - 设置滚动位置以在 Xamarin.Ios 中搜索字符串

c# - 如何使用 Monodevelop 为 iPhone 动态创建 UI

ios - 将 flatMap 与字典一起使用会产生元组吗?

java - 关于图像编辑中撤消-重做状态的可维护性的建议