【问题标题】:How to create reverse masks on CALayers如何在 CALayers 上创建反向蒙版
【发布时间】:2011-12-30 14:56:49
【问题描述】:

我会尽量简化。

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

我有一个红色视图和一个用于掩盖红色视图的图像。

我使用视图的CALayer 的mask 属性来应用遮罩,结果如下。

但是我想要的是相反的结果,例如 (想象一下,这里的白色部分其实是背景中的木头,因为我对图像编辑软件不是很好)

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

【问题讨论】:

标签: ios image xamarin.ios calayer mask


【解决方案1】:

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

【讨论】:

  • 这在某种程度上是一种解决方案,但是您是否有任何示例可以以编程方式反转图像的 alpha 并在不拉伸实际图像的情况下拉伸其内容大小?
【解决方案2】:

希望对你有帮助

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

步骤 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];

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2013-09-01
    • 2021-12-01
    • 1970-01-01
    • 2017-02-13
    • 2023-03-28
    • 2013-10-23
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多