Как выбрать часть изображения, обрезать и сохранить ее с помощью Swift?

Я пытаюсь создать приложение iOS с помощью Swift для захвата изображений и позволить пользователю сохранить выбранную часть изображения. Во многих приложениях на основе cam я заметил, что предлагается прямоугольная рамка, позволяющая пользователям выбирать нужную часть. Это включает или сползать края прямоугольника или двигать углы для приспособления необходимой области.

не могли бы вы указать мне, как реализовать этот подвижный прямоугольник и как сохранить только этот кусок изображения?

4 ответов


Использование Swift 3

обрезка изображения может быть сделано с помощью CGImages С CoreGraphics.

получить CGImage версию UIImage, как это:

// cgImage is an attribute of UIImage
let cgImage = image.cgImage

объекты CGImage имеют метод обрезка (to: CGRect) это делает обрезку:

let croppedCGImage: CGImage = cgImage.cropping(to: toRect)

наконец, преобразовать обратно из CGImage в объектами UIImage:

let uiImage = UIImage(cgImage: croppedCGImage)

пример:

func cropImage(image: UIImage, toRect: CGRect) -> UIImage? {
    // Cropping is available trhough CGGraphics
    let cgImage :CGImage! = image.cgImage
    let croppedCGImage: CGImage! = cgImage.cropping(to: toRect)

    return UIImage(cgImage: croppedCGImage)
}

атрибут CGRect обрезки определяет "прямоугольник обрезки" внутри изображения, которое будет обрезано.


нашел еще одно решение. На этот раз это в Swift. Решение выглядит элегантно, и код относительно других таких решений написан в меньшем количестве строк.

здесь.. https://github.com/DuncanMC/CropImg Спасибо Дункану Чампни за его работу на github.


https://github.com/myang-git/iOS-Image-Crop-View делает что-то вроде того, что вы ищете..

надеюсь, что это помогает.


если вы получаете проблему, как поворот 90 после обрезки изображения попробуйте это.
Сохраните исходное свойство масштаба и ориентации изображения для последующего использования

let imgOrientation = image?.imageOrientation
let imgScale = image?.scale

получить CGImage от UIImage:

let cgImage = image.cgImage

передайте область cropArea(CGRect), которую вы хотите обрезать (если вы используете imageView.изображение у вас есть найти масштаб и сделать математику, чтобы найти cgRect) добавление этого кода ниже, если это необходимо

let croppedCGImage = cgImage.cropping(to: cropArea)
let coreImage = CIImage(cgImage: croppedCGImage!)

нужен контекст для рендеринга изображения (его тяжелый процесс проверить https://developer.apple.com/documentation/coreimage/cicontext Если вы делаете несколько раз ), используя это, вы можете установить масштаб и ориентацию, которые мы создали в первой строке, чтобы изображение не вращалось 90

let ciContext = CIContext(options: nil)
let filteredImageRef = ciContext.createCGImage(coreImage, from: coreImage.extent)
let finalImage = UIImage(cgImage:filteredImageRef!, scale:imgScale!, orientation:imgOrientation!)
imageView.image = finalImage