来自CALayer的UIImage – iPhone SDK
在我的应用程序中,我创build了一个CALayer
(具有几个子层 – CALayer由添加为子层的形状组成)。
我想创build一个UIImage
,我将能够上传到服务器(我有这个代码)。 但是,我不知道如何将CALayer
添加到UIImage
。
这可能吗? 任何build议将是非常好的,非常感激。
非常感谢,Brett
听起来像你想渲染你的图层到一个UIImage。 在这种情况下,下面的方法应该做的伎俩。 只需将其添加到您的视图或控制器类,或在CALayer上创build一个类别。
- (UIImage *)imageFromLayer:(CALayer *)layer { UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0); [layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return outputImage; }
托德的答案是正确的,但是对于视网膜屏幕应该有一点区别:
- (UIImage *)imageFromLayer:(CALayer *)layer { if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) UIGraphicsBeginImageContextWithOptions([layer frame].size, NO, [UIScreen mainScreen].scale); else UIGraphicsBeginImageContext([layer frame].size); [layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return outputImage; }
我创build了一个基于此的Swift扩展:
extension UIImage { class func imageWithLayer(layer: CALayer) -> UIImage { UIGraphicsBeginImageContextWithOptions(layer.bounds.size, layer.opaque, 0.0) layer.renderInContext(UIGraphicsGetCurrentContext()!) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img } }
用法:
var gradient = CAGradientLayer() gradient.colors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor] gradient.frame = CGRect(x: 0, y: 0, width: 200, height: 200) let image = UIImage.imageWithLayer(gradient)
Swift 3版本的一些错误检查上下文。
extension UIImage { class func image(from layer: CALayer) -> UIImage? { UIGraphicsBeginImageContextWithOptions(layer.bounds.size, layer.isOpaque, UIScreen.main.scale) // Don't proceed unless we have context guard let context = UIGraphicsGetCurrentContext() else { UIGraphicsEndImageContext() return nil } layer.render(in: context) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } }