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

Я пытаюсь обрезать изображение, но обрезка не дает ожидаемой части UIImage. Изображения появляются не в ориентации и не зеркально отражаются. Это очень запутанно.

 @IBOutlet weak var imgPreViewOutlet: UIImageView!

 guard
        let cgImage = self.imgPreViewOutlet.image.cgImage else {return}


// NORMALISE COORDINATES
let topXn = TOP_LEFT.x/screenWidth
let topYn = TOP_LEFT.y/screenHeight
let widthn = (TOP_RIGHT.x - TOP_LEFT.x)/screenWidth
let heightn = (BOTTOM_RIGHT.y - TOP_RIGHT.y)/screenHeight


// DIMENSION OF CGIMAGE
let cgImgWidth = cgImage.width
let cgImgHeight = cgImage.height

let cropRect = CGRect.init(x: topXn * CGFloat.init(widthn) , y: topYn * CGFloat.init(heightn), width: widthn * CGFloat.init(cgImgWidth), height: heightn * CGFloat.init(cgImgHeight))

if let cgCropImged = cgImage.cropping(to: cropRect){

        print("cropRect: \(cropRect)")

        self.imgPreViewOutlet.image = UIImage.init(cgImage: cgCropImged)
    }

enter image description here

Кадрированные:

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

По запросу, вот пример использования 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, если вы ищете производительность.

Учитывая ваш ввод, вот вывод:

enter image description here

0 голосов
/ 17 сентября 2018

Базовые графические координаты исходят из нижней точки слева, координаты UIKit - из верхнего левого угла.Я думаю, что вы путаете их.

Это может помочь:

Как компенсировать перевернутую систему координат базовой графики для облегчения рисования?

...