Tho*_*asM 6 iphone mask objective-c uiimage ios
我正在尝试将一些UIImages渲染成一张我可以保存在相册中的单张图像.但似乎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];
Run Code Online (Sandbox Code Playgroud)
然后我使用此代码来保存我的合成图像:
UIGraphicsBeginImageContext(imageView.bounds.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *saver = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(saver, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
Run Code Online (Sandbox Code Playgroud)
编辑:这正确应用了面具
-(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);}
Run Code Online (Sandbox Code Playgroud)
Mac OS X 10.5 不支持该文档renderInContext:以及其他属性。mask我怀疑 iOS 上也是一样的,即使文档没有这么说。
为了解决您的问题,您可能必须将图层单独绘制到图形上下文中,并在图形上下文本身上设置正确的蒙版。
| 归档时间: |
|
| 查看次数: |
4476 次 |
| 最近记录: |