微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CGLayer CGGradient径向渐变效果不佳

如何解决CGLayer CGGradient径向渐变效果不佳

我正在使用以下代码获取具有CGLayer的alpha径向渐变:

    let scale = UIScreen.main.scale
    let roundedSize = round(size)
    var canvasSize = size_t(roundedSize)
    canvasSize *= size_t(scale)
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    context = CGContext(data: nil,width: canvasSize,height: canvasSize,bitsPerComponent: 8,bytesPerRow: canvasSize * 4,space: colorSpace,bitmapInfo: CGBitmapInfo.alphaInfoMask.rawValue & CGImageAlphaInfo.premultipliedLast.rawValue)
    cgLayer = CGLayer(context,size: CGSize(width: canvasSize,height: canvasSize),auxiliaryInfo: nil)
    let ctx = cgLayer.context
    var ctxRect = CGRect.zero
    ctxRect.size.height = CGFloat(canvasSize)
    ctxRect.size.width = ctxRect.size.height
    ctx?.clear(ctxRect)
    ctxRect = ctxRect.insetBy(dx: 1.0,dy: 1.0)
    let innerColor = UIColor(white: !whiteBrush ? 1.0 : 0.0,alpha: CGFloat(min(hardness + 0.5,1))).cgColor
    let outerColor = innerColor.copy(alpha: 0.0)
    if hardness != 1.0 {
        var locations = [CGFloat](repeating: 0.0,count: 2)
        locations[0] = hardness
        locations[1] = 1.0
        let colors = [innerColor,outerColor]
        let colorsCF = colors as CFArray
        let gradient = CGGradient(coloRSSpace: colorSpace,colors: colorsCF,locations: &locations)
        let center = CGPoint(x: CGFloat(canvasSize) / 2.0,y: CGFloat(canvasSize) / 2.0)
        if let gradient = gradient {
            ctx?.drawRadialGradient(gradient,startCenter: center,starTradius: 0.0,endCenter: center,endRadius: center.x - 1.0,options: .drawsAfterEndLocation)
        }

它应该呈现一个平滑的渐变,但是除了这个,我得到了两个不同的结果(图像为白色,在黑暗模式下看起来不错:D): 一种是中心较差的渐变(如果硬度> 0.5,则预期为中心)

enter image description here

或者具有相似的硬度和尺寸值,则有些模糊和丑陋:

enter image description here

如何通过创建渐变获得更好的结果?除了平滑过渡之外,我还有一些像素化的半椭圆形,看上去很丑。我想要类似画笔的东西,以便在Alpha通道上提供平滑的过渡。

我正在使用此代码“渲染”它们:

var image: UIImage? {
    context.setFillColor(gray: 1,alpha: 0)
    //CGContextSetFillColorWithColor(_context,[[UIColor clearColor] CGColor]);
    context.fill(context.boundingBoxOfClipPath)
    context.draw(cgLayer,at: CGPoint.zero)
    let cgImage = context.makeImage()
    var image: UIImage?
    if let cgImage = cgImage {
        image = UIImage(cgImage: cgImage,scale: 1,orientation: .up)
    }
    return image
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。