直接渲染一个CGImage(而不是UIImage)?

Posted

技术标签:

【中文标题】直接渲染一个CGImage(而不是UIImage)?【英文标题】:Render a CGImage (rather than UIImage) directly? 【发布时间】:2020-01-04 17:02:20 【问题描述】:

我正在制作CGImage

func otf() -> CGImage 

这是渐变上的贝塞尔蒙版。所以,

    // the path
    let p = UIBezierPath()
    p.moveTo etc

    // the mask
    let m = CAShapeLayer()
    set size etc
    m.path = p.cgPath

    // the layer
    let l = CAGradientLayer()
    set colors etc
    l.mask = m

完成了。所以然后以通常的方式渲染UIImage ...

    UIGraphicsBeginImageContextWithOptions(sz.size, false, UIScreen.main.scale)
    l.render(in: UIGraphicsGetCurrentContext()!)
    let r = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

但是。然后要返回,当然要转成CGImage

    return r.cgImage!

(如果你使用类似 .. 的东西,同样的处理方式

UIGraphicsImageRenderer(bounds: b).image  (c) in v.layer.render(in: c) 

.. 你得到的是 UIImage,而不是 CGImage。)

似乎应该有更好/更优雅的方式 - 是否有一些方法可以更直接地“构建 CGImage”,而不是“构建 UIImage,然后转换强>”?

【问题讨论】:

【参考方案1】:

需要创建CGContext才能直接生成CGImage

注意:- 使用此代码直接创建CGImage

func createImage() -> CGImage? 
        // the path
        var p = UIBezierPath()
        p = UIBezierPath(arcCenter: CGPoint(x: 100,y: 100), radius: CGFloat(200), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)


        // the mask
        let m = CAShapeLayer()
        m.path = p.cgPath

        // the layer
        let layer = CAGradientLayer()
        layer.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
        layer.colors = [UIColor.red.cgColor, UIColor.black.cgColor]
        layer.mask = m



        let imageSize = CGSize(width: 200, height: 200)

        let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)!
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
        guard let context = CGContext(data: nil, width: Int(imageSize.width), height: Int(imageSize.height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) else  return nil 

        layer.render(in: context)
        let img = context.makeImage()
        return img
    

【讨论】:

以上是关于直接渲染一个CGImage(而不是UIImage)?的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImage 转换为 CGImage 会导致图像旋转

将 NSString 绘制到 UIImage

为啥我的 CGImage 是 UIImage 大小的 3 倍

如何从 UIImage (Cocoa Touch) 或 CGImage (Core Graphics) 获取像素数据?

在前向类对象“UIImage”中找不到属性“CGImage”

将 UIImage 转换为 CGImage 以获取像素颜色