来自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 } }