Создайте новый UIImage из нарисованной от руки линии над UIImage - Swift - PullRequest
0 голосов
/ 17 декабря 2018

Это мой первый вопрос, поэтому, пожалуйста, извините, если я не совсем уверен.

Я хотел бы иметь возможность создать новый UIImage2 из содержимого нарисованной от руки фигуры поверх существующейUIImage1 для отображения поверх существующего UIImage1.

Наглядный пример: UIImage1 - это фотография горизонта города.Пользователь должен иметь возможность нарисовать контур вокруг небоскреба и создать новый UIImage2, который будет отображаться в стеке над UIImage1, с возможностью редактирования (размер, цвет и т. Д.) UIImage 2.

Рисование линий поверхUIImage не слишком сложен, но мне еще предстоит выяснить, как захватить содержимое из UIImage в пределах этой нарисованной от руки формы, создавая отдельный UIImage.

Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 17 декабря 2018

Если вы хотите создать изображение из маскированного пути, вы можете:

  • Создать UIBezierPath из пользовательского жеста
  • Использовать этот путь Безье в качестве CAShapeLayer впредставление изображения
  • Когда пользователь выполнит жест, удалите этот слой формы, но создайте новый слой формы и используйте его в качестве маски
  • Создание изображения из этого представления маскированного изображения:
    • Используйте UIGraphicsBeginImageContextWithOptions для начала процесса рендеринга изображения;
    • Используйте drawHierarchy для рендеринга всего, что должно быть захвачено на изображении;
    • Используйте UIGraphicsGetImageFromCurrentImageContext для захвата изображения с любого изображения и
    • Используйте UIGraphicsEndImageContext, чтобы указать, что процесс рендеринга изображения завершен.

Например:

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

            guard let image = imageView?.snapshot else { return }
            imageView.layer.mask = nil

            // perhaps use that image?

            imageView.image = image

        default: break
        }
    }

}

Кстати, чтобы создать UIImage из вида (в маске или иным образом), вы можете использовать:

extension UIView {
    var snapshot: UIImage? {
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0)
        drawHierarchy(in: bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

Это дает что-то вроде:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...