ios – 在将uiview捕获到uiimage时,掩码不起作用

我有一个UIView,我想保存为UI Image.我使用UIGraphicsBeginImageContext这样做,它可以正常工作.但是当我对(view / layer.mask)中的图像应用蒙版时,我通过UIGraphicsBeginImageContext捕获的图像是错误的(运行应用程序时屏蔽是正常的,但是当尝试从UIView获取UIImage时).有人遇到类似的问题吗?

解决方法

如果我理解正确,您希望从UIView层创建一个UIImage,而该层被屏蔽.我假设你想让目标UIImage拥有透明的背景.

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

https://bitbucket.org/reydan/so_imagemask

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

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

我也会在这里发布两种方法

- (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;
}

编辑

显然renderInContext:在IOS6上不使用掩码(因为它也在这里说SO).
我的解决办法是手动将蒙版应用于图像.掩码是从该层的掩码属性获取的,并且在上下文中渲染,因此我们对transformations / contentModes / etc没有任何问题.

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

- (IBAction)oncopyImage:(id)sender {

    // Get the image from the mainImageView
    UIGraphicsBeginImageContextWithOptions(_mainContainerView.bounds.size,[[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;

}

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...