Swift: Image Perdre Format d'image Lorsque le tracé commence

voix
0

Je tente une retouche d'image VC pour mon application et rencontrai la question ci-dessus. Chaque fois que je commence à dessiner sur mon image, l'image serait déformer et perdre le rapport d'aspect.

Gif en tant que tel:

entrez

Mon code complet en tant que tel:

class DrawImageController: UIViewController {

    var canvasImageView: UIImageView = {
        let iv = UIImageView()
        iv.translatesAutoresizingMaskIntoConstraints = false
        iv.backgroundColor = .yellow
        iv.contentMode = .scaleAspectFit
        return iv
    }()

    var lastTouch = CGPoint.zero

    override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
    }

    func setupViews() {
        view.backgroundColor = .black

        view.addSubview(canvasImageView)

        canvasImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        canvasImageView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        canvasImageView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        canvasImageView.heightAnchor.constraint(equalToConstant: 300).isActive = true

        canvasImageView.image = UIImage(named: testImage)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let firstTouch = touches.first {
            lastTouch = firstTouch.location(in: canvasImageView)
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let firstTouch = touches.first {
            let touchLocation = firstTouch.location(in: canvasImageView)
            drawLine(from: lastTouch, to: touchLocation)
            lastTouch = touchLocation
        }
    }

    func drawLine(from: CGPoint, to: CGPoint) {
        UIGraphicsBeginImageContext(canvasImageView.frame.size)

        if let context = UIGraphicsGetCurrentContext() {
            canvasImageView.image?.draw(in: CGRect(x: 0, y: 0, width: canvasImageView.frame.size.width, height: canvasImageView.frame.size.height))

            context.move(to: from)
            context.addLine(to: to)

            context.setLineCap(.round)
            context.setLineWidth(5.0)
            context.setStrokeColor(UIColor.blue.cgColor)

            context.strokePath()

            let image = UIGraphicsGetImageFromCurrentImageContext()
            canvasImageView.image = image
            UIGraphicsEndImageContext()
        }          
    }
}

J'adapté mon procédé d'étirage à partir de divers didacticiels sur youtube, github et SO. Est-ce que des conseils à personne où aurais-je pu mal tourné pls? Merci.

Créé 02/09/2018 à 04:57
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Le problème est ici:

canvasImageView.image?.draw(in: CGRect(x: 0, y: 0, width: canvasImageView.frame.size.width, height: canvasImageView.frame.size.height))

Vous dessinez l'image en utilisant le cadre de l'affichage de l' image. Ceci étend l'image.

Vous devez dessiner l'image comme si contentMode est .scaleAspectFit.

Pour ce faire, tout d' abord déterminer le rapport d'aspect de l'image (W: H). Vous pouvez le faire par l' accès à la sizepropriété UIImage. Comparer ce rapport au rapport d'aspect de la vue de l' image.

Si le coefficient de l'image est inférieure à la vue de, alors cela signifie que la hauteur à laquelle vous dessiner l'image peut être le même que le point de vue de l'image hauteur et la largeur de l'image peut être calculée en utilisant le rapport d'aspect de l'image.

Si le coefficient de l'image est plus grande que celle de la vue, alors cela signifie que la largeur à laquelle vous dessiner l'image peut être le même que le point de vue de l'image la largeur et la hauteur de l'image peut être calculée,

Créé 02/09/2018 à 07:51
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more