【发布时间】:2011-02-04 09:15:27
【问题描述】:
我正在尝试将一些 UIImages 渲染为 1 张可以保存在相册中的单张图像。但是好像 layer.renderInContext 没有考虑图层蒙版?
当前行为:照片保存,我看到了mosaicLayer,没有maskLayer的遮罩效果。
预期行为:照片保存,我在视图中看到了图像,上面还有一个蒙版的镶嵌图层。
我使用下面的代码来屏蔽图像
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);}
【问题讨论】:
-
,,我也需要做类似的代码,你能不能给我一些有用的代码。提前致谢
标签: iphone objective-c ios uiimage mask