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?