Я делаю приложение для рисования, которое позволяет пользователям рисовать на видеокадрах, поэтому при рисовании в UIImageView я добавляю Bezierpath в CAShapeLayer и устанавливаю к нему теневой путь, и он отлично работает, дело в том, что когда я хочу преобразовать слой в cg или uiimage, который в конечном итоге будет ciimage (чтобы составить видеокадр), UIGraphicContext отбрасывает насыщенность тени, например, линия в CAShapeLayer не имеет теневого пути, а просто простая тень с гораздо меньшей насыщенностью это изображение при рисовании с тенью
this image is the path with the same shadow after converting to image
введите описание изображения здесь
Я пробовал множество разных методов, которые я мог найти в SOF или любом другом месте на inte rnet, поэтому в основном есть два способа преобразовать путь в изображение (ci, ui, cg), и все они используют ту же практику, которая является UIGraphicContext (если есть какой-либо другой способ, ПОЖАЛУЙСТА, сообщите мне), поэтому я попытался преобразовать слой в uiimage (путем рендеринга его в CGContext), а также попытался нарисовать путь непосредственно на context, рисование контура напрямую дало мне (просто) небольшое улучшение, чем рендеринг слоя в контексте. это код для прямого рисования пути в контексте:
UIGraphicsBeginImageContextWithOptions(size, false, 0)
let context = UIGraphicsGetCurrentContext()!
//// Shadow Declarations
let shadow = UIColor.yellow.withAlphaComponent(1)
let shadowOffset = CGSize(width: 0, height: 0) //offset is the same as when drawing a path on CAShapeLayer
let shadowBlurRadius: CGFloat = 20
//// Bezier 2 Drawing
context.saveGState()
context.addPath(path.cgPath)
context.setShadow(offset: shadowOffset, blur: shadowBlurRadius, color: (shadow as UIColor).cgColor)
path.lineCapStyle = .round
path.lineCapStyle = .round
UIColor.white.setStroke()
path.lineWidth = 10
path.stroke(with: .color, alpha: 1.0)
//context.strokePath()
context.restoreGState()
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
Я был бы очень признателен за любую помощь или подсказку, что я могу получить тот же результат тени после преобразования.
Обновлено :
вот код, который генерирует тень на слое, который отлично работает на виде (первое изображение). Мне нужен тот же результат после рендеринга или рисования в контексте.
private func setTheLayer(layer: CAShapeLayer, size: Int, path: CGPath, glowing: Bool, color: CGColor) {
if glowing {
layer.path = path
layer.fillColor = nil
layer.opacity = 1.0
layer.lineWidth = CGFloat(size)
layer.lineCap = .round
layer.lineJoin = .round
layer.strokeColor = UIColor.white.cgColor
// drawing the glow shadow
layer.shadowPath = path.copy(strokingWithWidth: CGFloat(size) * 4, lineCap: .round, lineJoin: .round, miterLimit: 0)
layer.shadowOffset = CGSize(width: 0, height: 0)
layer.shadowColor = color
layer.shadowRadius = 5.0
layer.shadowOpacity = 0.7
} else {
layer.path = path
layer.fillColor = nil
layer.opacity = 1.0
layer.lineWidth = CGFloat(size)
layer.lineCap = .round
layer.lineJoin = .round
layer.strokeColor = color
}
}