Это мой первый вопрос, поэтому, пожалуйста, извините меня, если я не совсем понимаю.
Я хотел бы иметь возможность создать новый UIImage2 из содержимого нарисованной от руки фигуры поверх существующего UIImage1 для отображения поверх существующего UIImage1.
Наглядный пример: UIImage1 - фотография горизонта города. Пользователь должен иметь возможность нарисовать контур вокруг небоскреба и создать новый UIImage2, который будет отображаться наложенным поверх UIImage1, с возможностью редактирования (размера, цвета и т. д.) UIImage 2.
Рисование линий поверх UIImage не так уж сложно, но мне еще предстоит выяснить, как захватить контент из UIImage внутри этой нарисованной от руки формы, создав отдельный UIImage.
Буду очень признателен за любую помощь.
и спасибо за подсказку. Я подробно рассмотрю эти функции. Ценить это!
Ты святой. Спасибо, что указали мне правильное направление.





Если вы хотите создать изображение из замаскированного контура, вы можете:
UIBezierPath из жеста пользователя;CAShapeLayer в представлении изображения;UIGraphicsImageRenderer и drawHierarchy, чтобы визуализировать все, что должно быть захвачено в изображении.Например:
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
private var path: UIBezierPath?
private var strokeLayer: CAShapeLayer?
@IBAction func didHandlePan(_ gesture: UIPanGestureRecognizer) {
let location = gesture.location(in: imageView)
switch gesture.state {
case .began:
path = UIBezierPath()
path?.move(to: location)
strokeLayer = CAShapeLayer()
imageView.layer.addSublayer(strokeLayer!)
strokeLayer?.strokeColor = #colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1).cgColor
strokeLayer?.fillColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0).cgColor
strokeLayer?.lineWidth = 5
strokeLayer?.path = path?.cgPath
case .changed:
path?.addLine(to: location)
strokeLayer?.path = path?.cgPath
case .cancelled, .ended:
// remove stroke from image view
strokeLayer?.removeFromSuperlayer()
strokeLayer = nil
// mask the image view
let mask = CAShapeLayer()
mask.fillColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1).cgColor
mask.strokeColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0).cgColor
mask.lineWidth = 0
mask.path = path?.cgPath
imageView.layer.mask = mask
// get cropped image
let image = imageView?.snapshot
imageView.layer.mask = nil
// perhaps use that image?
imageView.image = image
default: break
}
}
}
Кстати, чтобы создать UIImage из вида (замаскированного или иначе), вы можете использовать:
extension UIView {
var snapshot: UIImage {
UIGraphicsImageRenderer(bounds: bounds).image { _ in
drawHierarchy(in: bounds, afterScreenUpdates: true)
}
}
}
Это дает что-то вроде:
Привет, Роб, спасибо, что попросил разъяснений. Захваченное изображение должно содержать часть исходного изображения, которая находится внутри нарисованной формы.