如何在CALayers上创建反向掩码

Lou*_*oux 10 image mask calayer xamarin.ios ios

我会尽可能简单.

如何CALayers在iOS中创建反向掩码?

我有一个红色视图和一个用于掩盖红色视图的图像. 在此输入图像描述

我使用视图的CALayermask属性来应用掩码,结果如下. 在此输入图像描述

然而,我想要的是相反的结果,例如(想象这里的白色部分实际上是背景中的木材,因为我对图像编辑软件不是很好) 在此输入图像描述

换句话说:我希望掩蔽图像在视图中打孔,而不是作为实际的遮罩层.C#(MonoTouch)或Obj-C中的答案都很好

小智 5

希望它有所帮助

第1步:创建一个没有任何alpha通道的蒙版.

步骤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];
}
Run Code Online (Sandbox Code Playgroud)

步骤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];
}
Run Code Online (Sandbox Code Playgroud)

成品.

怎么打电话?

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];
Run Code Online (Sandbox Code Playgroud)


Mik*_*atz 1

您需要反转蒙版的 Alpha,因此“孔”就是透明像素。您还需要拉伸图像以覆盖整个红色视图。

  • 这在某种程度上是一种解决方案,但是您是否有任何示例可以以编程方式反转图像的 Alpha 并拉伸其内容大小而不拉伸实际图像? (10认同)