По запросу, вот пример использования CIPerspectiveCorrection
для обрезки вашего изображения.Я скачал и использовал Sketch, чтобы получить приблизительные значения 4 CGPoints
в вашем примере изображения.
let inputBottomLeft = CIVector(x: 38, y: 122)
let inputTopLeft = CIVector(x: 68, y: 236)
let inputTopRight = CIVector(x: 146, y: 231)
let inputBottomRight = CIVector(x: 151, y: 96)
let filter = CIFilter(name: "CIPerspectiveCorrection")
filter?.setValue(inputTopLeft, forKey: "inputTopLeft")
filter?.setValue(inputTopRight, forKey: "inputTopRight")
filter?.setValue(inputBottomLeft, forKey: "inputBottomLeft")
filter?.setValue(inputBottomRight, forKey: "inputBottomRight")
filter?.setValue(ciOriginal, forKey: "inputImage")
let ciOutput = filter?.outputImage
Обратите внимание на несколько вещей:
- Самое важное для никогда забудьте о том, что CoreImage является источником
CIImage
внизу слева, а не вверху слева.Вам необходимо «перевернуть» точку оси Y. - A
UIImage
имеет размер, а CIImage
имеет экстент.Это одно и то же.(Единственный раз, когда это происходит, когда используется CIFIlter для «создания» чего-либо - цвета, мозаичного изображения - и тогда оно бесконечно.) - A
CIVector
может иметь довольно много свойств.В этом случае я использую подпись X / Y, и это прямая копия CGPoint
, за исключением того, что ось Y перевернута. - У меня есть пример проекта здесь , который использует
UIImageView
.Имейте в виду, что производительность на симуляторе далеко не такая, как на реальном устройстве - я рекомендую использовать устройство каждый раз, когда задействован CoreImage.Кроме того, я сделал прямой перевод из выходного CIImage в UIImage.Обычно лучше использовать CIContext
и CoreGraphics
, если вы ищете производительность.
Учитывая ваш ввод, вот вывод: