我正在使用此代码来获得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,则需要实心)
或者具有相似的硬度和大小值,更模糊和丑陋的东西:
如何通过创建渐变获得更好的结果?而不是平滑过渡,我有一些像素化的半椭圆形,看起来很难看。我想要像画笔一样的东西,它可以在 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
}