将uiview捕获到uiimage时,蒙版不起作用

Tha*_*ios 11 mask calayer uiview uiimage ios

我有一个UIView我想保存的UIImage.我这样做UIGraphicsBeginImageContext,它工作正常.但是当我将掩码应用于(view/layer.mask)中的图像时,我捕获的图像UIGraphicsBeginImageContext是错误的(在运行应用程序时屏蔽是有效的,但在尝试UIImage从a 获取时却没有UIView).有人遇到类似的问题?

And*_*scu 5

如果我理解正确,你希望从UIView层创建一个UIImage,同时屏蔽该层.我假设您希望目标UIImage具有透明背景.

我没有遇到任何问题,我有一个演示项目你可以看看:

https://bitbucket.org/reydan/so_imagemask

首先需要按Mask按钮.它将从包中加载一个蒙版图像(黑色和白色),并将其设置为上面UIView容器的图层蒙版.

然后,您可以按下复制图像按钮,将UIView容器渲染为UIImage,然后将其设置为下面的目标图像视图以查看结果.

我还将在这里发布2种方法:

- (IBAction)onMask:(id)sender {

    UIImage* maskImage = [UIImage imageNamed:@"star.png"];
    UIImageView* maskImageView = [[UIImageView alloc] initWithImage:maskImage];
    maskImageView.contentMode = UIViewContentModeScaleAspectFit;
    maskImageView.frame = _mainContainerView.bounds;

    _mainContainerView.layer.mask = maskImageView.layer;
}

- (IBAction)onCopyImage:(id)sender {

    UIGraphicsBeginImageContextWithOptions(_mainContainerView.bounds.size, FALSE, [[UIScreen mainScreen] scale]);
    [_mainContainerView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    _destImageView.image = img;
}
Run Code Online (Sandbox Code Playgroud)

编辑

显然renderInContext:在IOS6上没有使用掩码(因为它也在SO上说).我的解决方案是手动将蒙版应用于图像.掩码取自层的掩码属性并在上下文中渲染,因此我们对转换/ contentModes/etc没有任何问题.

这是更新的源代码(也可以在bitbucket上获得):

- (IBAction)onCopyImage:(id)sender {

    // Get the image from the mainImageView
    UIGraphicsBeginImageContextWithOptions(_mainContainerView.bounds.size, FALSE, [[UIScreen mainScreen] scale]);
    [_mainContainerView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    // Use the next block if targeting IOS6
    {
        // Manually create a mask image (taken from the mask layer)
        UIGraphicsBeginImageContextWithOptions(_mainContainerView.bounds.size, TRUE, [[UIScreen mainScreen] scale]);

        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
        CGContextFillRect(ctx, _mainContainerView.bounds);

        [_mainContainerView.layer.mask renderInContext:ctx];
        UIImage * maskimg = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();


        // Create a image mask from the UIImage
        CGImageRef maskRef = maskimg.CGImage;
        CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                            CGImageGetHeight(maskRef),
                                            CGImageGetBitsPerComponent(maskRef),
                                            CGImageGetBitsPerPixel(maskRef),
                                            CGImageGetBytesPerRow(maskRef),
                                            CGImageGetDataProvider(maskRef), NULL, false);

        // Apply the mask to our source image
        CGImageRef maskedimg= CGImageCreateWithMask(img.CGImage, mask);

        // Convert to UIImage so we can easily display it in a UIImageView
        img = [UIImage imageWithCGImage:maskedimg scale:img.scale orientation:img.imageOrientation];

        CGImageRelease(mask);
        CGImageRelease(maskedimg);
    }



    _destImageView.image = img;

}
Run Code Online (Sandbox Code Playgroud)

编辑 请检查bitbucket上的最新项目,因为它包含最新版本.