layer.renderInContext不考虑layer.mask?

我正在尝试将一些UIImage渲染成我可以保存在我的相册中的单个图像。 但是,似乎layer.renderInContext没有考虑到图层遮罩?

目前的行为:照片保存,我看到mosaicLayer,没有掩码效果的maskLayer。

预期的行为:照片保存,我看到我的视图中的图像,顶部是一个蒙面的mosaicLayer。

我使用下面的代码来掩盖图像

UIImage *maskImg = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mask" ofType:@"png"]]; maskLayer = [[UIImageView alloc] initWithImage:maskImg]; maskLayer.multipleTouchEnabled = YES; maskLayer.userInteractionEnabled = YES; UIImageView *mosaicLayer = [[UIImageView alloc] initWithImage:img]; mosaicLayer.contentMode = UIViewContentModeScaleAspectFill; mosaicLayer.frame = [imageView bounds]; mosaicLayer.layer.mask = maskLayer.layer; [imageView addSubview:mosaicLayer]; 

然后我使用这段代码保存我的合成图像:

 UIGraphicsBeginImageContext(imageView.bounds.size); [imageView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *saver = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(saver, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 

编辑 :这适用于正确的面具

 -(IBAction) saveImage { UIImage * saver = nil; CGImageRef image = imageView.image.CGImage; size_t cWidth = CGImageGetWidth(image); size_t cHeight = CGImageGetHeight(image); size_t bitsPerComponent = 8; size_t bytesPerRow = 4 * cWidth; //Now we build a Context with those dimensions. CGContextRef context = CGBitmapContextCreate(nil, cWidth, cHeight, bitsPerComponent, bytesPerRow, CGColorSpaceCreateDeviceRGB(), CGImageGetBitmapInfo(image)); //The location where you draw your image on the context is not always the same location you have in your UIView, //this could change and you need to calculate that position according to the scale between you images real size, and the size of the UIImage being show on the UIView. Hence the mod floats... CGContextDrawImage(context, CGRectMake(0, 0, cWidth,cHeight), image); float mod = cWidth/(imageView.frame.size.width); float modTwo = cHeight/(imageView.frame.size.height); //Make the drawing right with coordinate switch CGContextTranslateCTM(context, 0, cHeight); CGContextScaleCTM(context, 1.0, -1.0); CGContextClipToMask(context, CGRectMake(maskLayer.frame.origin.x * mod, maskLayer.frame.origin.y * modTwo, maskLayer.frame.size.width * mod,maskLayer.frame.size.height * modTwo), maskLayer.image.CGImage); //Reverse the coordinate switch CGAffineTransform ctm = CGContextGetCTM(context); ctm = CGAffineTransformInvert(ctm); CGContextConcatCTM(context, ctm); CGContextDrawImage(context, CGRectMake(0, 0, cWidth,cHeight), mosaicLayer.image.CGImage); CGImageRef mergeResult = CGBitmapContextCreateImage(context); saver = [[UIImage alloc] initWithCGImage:mergeResult]; CGContextRelease(context); CGImageRelease(mergeResult); UIImageWriteToSavedPhotosAlbum(saver, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);} 

renderInContext:的文档renderInContext:在其他属性中,Mac OS X 10.5不支持mask 。 我怀疑它在iOS上是一样的,即使文档没有这样说。

为了解决你的问题,你可能需要将图层分别绘制到graphics上下文中,在graphics上下文中设置正确的蒙板。