SWIFT 4.2: IGRPhotoTweaks cropAction plus CIPerspectiveCorrection - PullRequest
1 голос
/ 06 марта 2019

IOS 11+, Swift 4.2. Я использую IGRPhotoTweaks для обрезки и поворота. Он идеально подходит для этих нужд.

Теперь я пытаюсь включить коррекцию перспективы и немного потерян. Это кажется таким простым, я могу заставить обоих работать по отдельности, но не согласованно.

Мой процесс:

в контроллере представления редактирования моего билета:

 extension TicketEditViewController: IGRPhotoTweakViewControllerDelegate {
    func photoTweaksController(_ controller: IGRPhotoTweakViewController, didFinishWithCroppedImage croppedImage: UIImage) {
        _ = controller.navigationController?.popViewController(animated: true)

        self.takenImage = croppedImage

    }

    func photoTweaksControllerDidCancel(_ controller: IGRPhotoTweakViewController) {
        _ = controller.navigationController?.popViewController(animated: true)
    }
}

Когда я получаю didFinishWithCroppedImage, у меня есть обрезанное изображение, а затем исходное изображение.

Вопрос: как мне затем применить перспективу к этому обрезанному изображению билета, который был обрезан в область в билете?

Это мой фрагмент кода (взят из https://github.com/kronik/smartcrop). Он работает с полным билетом на другом фоне, но когда я пытаюсь передать только обрезанную область билета, он не получает никаких функций ().

    let docImage = CIImage(image: originalImage!)!
    var rect: CIRectangleFeature = CIRectangleFeature()        
    if let detector = CIDetector(ofType: CIDetectorTypeRectangle,
                                 context: ciContext,
                                 options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]) {

        let features = detector.features(in: docImage)
        if features.first != nil {
        rect = detector.features(in: docImage).first as! CIRectangleFeature
        } else {
            nextStepButton.setTitle("Error, no points detected", for: .normal)
            return
        }
    }

    let perspectiveCorrection = CIFilter(name: "CIPerspectiveCorrection")!
    let docImage = CIImage(image: originalImage!)!

    perspectiveCorrection.setValue(CIVector(cgPoint:rect.topLeft),
                                   forKey: "inputTopLeft")
    perspectiveCorrection.setValue(CIVector(cgPoint:rect.topRight),
                                   forKey: "inputTopRight")
    perspectiveCorrection.setValue(CIVector(cgPoint:rect.bottomRight),
                                   forKey: "inputBottomRight")
    perspectiveCorrection.setValue(CIVector(cgPoint:rect.bottomLeft),
                                   forKey: "inputBottomLeft")
    perspectiveCorrection.setValue(docImage,
                                   forKey: kCIInputImageKey)

    let outputImage = perspectiveCorrection.outputImage

    let updatedImage = UIImage(ciImage: outputImage!, scale: originalImage!.scale, orientation: .up)

Как я могу получить правильный "прямоугольник" из UIImage (croppedImage) из IGRTweaks и передать его вpectiveCorrection?

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