来自iOS中CALayer的UIImage

Bre*_*ett 37 objective-c calayer uiimageview uiimage ios

在我的应用程序中,我创建了一个CALayer(有几个子层 - CALayer由添加为子层的形状组成).

我正在尝试创建一个UIImage我将能够上传到服务器(我有这个代码).但是,我无法弄清楚如何添加CALayer到a UIImage.

这可能吗?

Tod*_*ell 105

听起来你想将你的图层渲染成UIImage.在这种情况下,下面的方法应该可以解决问题.只需将其添加到视图或控制器类,或在CALayer上创建一个类别.

- (UIImage *)imageFromLayer:(CALayer *)layer
{
  UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0);

  [layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();

  return outputImage;
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用`UIGraphicsBeginImageContextWithOptions(layer.frame.size,layer.opaque,0);` (11认同)

Öme*_*Gül 18

托德的答案是正确的,但对于视网膜屏幕应该有一些区别:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

  • 为`UIGraphicsBeginImageContextWithOptions()` 的`scale` 参数指定`0` 会默认使用`UIScreen.mainScreen.scale`。_(根据文档,“应用于位图的比例因子。如果您指定的值为 0.0,则比例因子将设置为设备主屏幕的比例因子。”)_ 您的回答在功能上没有比 @ 提供任何改进托德·扬德尔的。 (4认同)

Heb*_*ida 9

我已经为此创建了一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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)
Run Code Online (Sandbox Code Playgroud)


Jus*_*ght 5

Swift 3版本,带有一点错误检查上下文.

extension UIImage {
  class func image(from layer: CALayer) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(layer.bounds.size, 
  layer.isOpaque, UIScreen.main.scale)

    defer { UIGraphicsEndImageContext() }

    // Don't proceed unless we have context
    guard let context = UIGraphicsGetCurrentContext() else {
      return nil
    }

    layer.render(in: context)
    return UIGraphicsGetImageFromCurrentImageContext()
  }
}
Run Code Online (Sandbox Code Playgroud)