创建 UIImage 抠图
Posted
技术标签:
【中文标题】创建 UIImage 抠图【英文标题】:Create UIImage cutout 【发布时间】:2012-05-09 13:53:50 【问题描述】:我有一个 UIView
包含 2 个 UIImageViews
- 一个框架和框架后面的图片。框架不是矩形 - 它是不规则的形状。用户可以操作框架后面的图片(缩放、旋转和平移),完成后,我想捕捉框架内图片的剪切 - 而不是图片和框架一起。有什么办法可以做到吗?
我已经设法将图片和框架拼合为一个图像,如下所示,但我只想要图片,如果成功提取,它将具有框架形状的边框。
- (IBAction)renderPhoto:(id)sender
//Combine the layers into a single image
UIView *canvas = [[[sender superview] subviews] objectAtIndex:0];
UIGraphicsBeginImageContext(canvas.bounds.size);
[canvas.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *combinedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
【问题讨论】:
【参考方案1】:使用我的这个方法..
- (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
UIGraphicsBeginImageContext(photo.frame.size);/// use your screen or photo frame
[photo.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef imageRef = CGImageCreateWithImageInRect([screenshot CGImage], rect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];
/* no origin .....
UIGraphicsBeginImageContext(tempview.frame.size);
[[self.photo layer] renderInContext:UIGraphicsGetCurrentContext()];
cropped= UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
*/
return cropped;
希望对你有帮助.... :)
【讨论】:
但这只有在我想剪一个方形框架时才有效?我的框架形状不规则...... 哦,那么我认为 OpenGL ES 2.0 可以使用一些内置功能。 【参考方案2】:您可以从您的框架中创建一个蒙版,并将此蒙版应用到目标图像上,从而从本质上将框架从目标图像中剪掉。或者,根据您最终使用最终图像的方式,在执行绘图时使用框架剪辑上下文可能更简单。
本主题涵盖了所有内容:https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-TPXREF101
第二个选项(剪切上下文)在Masking an Image by Clipping the Context下。
【讨论】:
好的...一直在看指南。只有一个问题 - 如何使用 Quartz 创建功能创建图像?然后我做类似'CGContextClipToMask(combinedImage,CGRectMake(0, 0,combinedImage.size.width,combinedImage.size.height),mask);'到我的组合图像? 可以通过 UIImage 的 CGImage 属性获取一个 CGImage。你可以通过这种方式获得你需要的 CGContext:CGContextRef cgContext = UIGraphicsGetCurrentContext();
在你调用UIGraphicsBeginImageContext
之后。您需要在调用 CGContextClipToMask 后将目标图像绘制到上下文中(仅将帧图像传递给此,而不是组合 - 基本上,这会影响后续的绘制操作,因此它们会遗漏任何绘图框架落在哪里)。以上是关于创建 UIImage 抠图的主要内容,如果未能解决你的问题,请参考以下文章