0

我正在使用此代码来获得CGLayeralpha 径向渐变:

    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,则需要实心)

在此处输入图像描述

或者具有相似的硬度和大小值,更模糊和丑陋的东西:

在此处输入图像描述

如何通过创建渐变获得更好的结果?而不是平滑过渡,我有一些像素化的半椭圆形,看起来很难看。我想要像画笔一样的东西,它可以在 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
}
4

0 回答 0