Как обрезать изображение под заданным углом с помощью swift

Кто-нибудь знает, как обрезать изображение с заданным углом с помощью swift? Я выложил демо-изображение ниже. Я немного погуглил и обнаружил, что почти все решения касались изображения без вращения или поворота на 90 градусов. Я хочу повернуть изображение, а затем обрезать его, как в приложении «Фото» на iPhone. Спасибо за подсказку!

Crop an image with a given angle

3
0
705
2

Ответы 2

Проектируйте раскадровку и создавайте выходы и свойства в классе ViewController.

let picker = UIImagePickerController()
var circlePath = UIBezierPath()
@IBOutlet weak var crop: CropView!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var scroll: UIScrollView!

Свойство обрезки имеет настраиваемый класс UIView. Добавьте в него функцию делегата ниже.

func point(inside point: CGPoint, with event:   UIEvent?) -> Bool{
return false
}

Создать расширение для UIImage и UIImageView - см. Для увеличения изображения используйте функцию делегата viewForZooming, затем добавьте UIScrollViewDelegate в класс в качестве подтипа и верните imageView.

Выберите изображение из галереи - Создайте IBAction, чтобы выбрать изображение из альбома и установить тип источника выбора в качестве библиотеки фотографий, используйте приведенный ниже код.

picker.sourceType = .photoLibrary
present(picker, animated: true, completion: nil)

и добавьте UIImagePickerControllerDelegate в класс как подтип. В viewDidLoad,

picker.delegate = self

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

let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
imageView.image = chosenImage.resizeImage()
dismiss(animated:true, completion: nil)

Чтобы закрыть фотоальбом после отмены, используйте делегат imagePickerControllerDidCancel.

Снимать картинку с камеры - Создайте IBAction, чтобы снимать изображение с камеры. Сначала проверьте, доступен ли SourceTypeAvailable в устройстве. Если в сборщике установлен режим захвата камеры как фото. В противном случае обработайте действие. Затем установите тип источника как камеру и режим захвата камеры как фотографию.

if UIImagePickerController.isSourceTypeAvailable(.camera){  
picker.sourceType = UIImagePickerControllerSourceType.camera
picker.cameraCaptureMode =  UIImagePickerControllerCameraCaptureMode.photo
picker.modalPresentationStyle = .custom
present(picker,animated: true,completion: nil)
}else{
//action performed if there is no camera in device.
}

Обрезка -

Добавить подслой к выбранному изображению - этот слой предоставляет область для фиксации рамки кадрирования.

let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height), cornerRadius: 0)

Назначьте путь свойству пути круга как тип UIBezierPath. Используя BezierPath, вы можете изменять форму рамки обрезки.

circlePath = UIBezierPath(roundedRect: CGRect(x: (self.view.frame.size.width / 2) - (size/2), y: (self.view.frame.size.height / 2) - (size / 2), width: size, height: size, cornerRadius: 0)
path.append(circlePath)

CAShapeLayer, который рисует кубический сплайн Безье в своем координатном пространстве.

let fillLayer = CAShapeLayer()
fillLayer.path = path.cgPath

Наконец, добавьте слой для просмотра,

view.layer.addSublayer(fillLayer)

Добавить область обрезки: Создайте область урожая. Для этого нам нужно установить коэффициент, разделив ширину изображения imageView на установленный масштаб ширины рамки просмотра,

let factor = imageView.image!.size.width/view.frame.width

для масштабирования как прокрутки zoomScale.

let scale = 1/scroll.zoomScale

Затем установите рамку области обрезки (x, y, ширина, высота).

let x = (scroll.contentOffset.x + circlePath.bounds.origin.x - imageFrame.origin.x) * scale * factor
let y = (scroll.contentOffset.y + circlePath.bounds.origin.y - imageFrame.origin.y) * scale * factor
let width =  circlePath.bounds.width  * scale * factor
let height = circlePath.bounds.height  * scale * factor

Наконец, создайте IBAction для обрезки изображения.

let croppedCGImage = imageView.image?.cgImage?.cropping(to: croparea)
let croppedImage = UIImage(cgImage: croppedCGImage!)

Один из вариантов - использовать CGContext и CGAffineTransform для поворота в соответствии с вашим углом.

Сделайте два прямоугольника: один для повернутого изображения и один для кадрирования, и используйте кадрирование (для прямоугольника: CGRect) -> CGImage?

наконец, в соответствии с вашей логикой сделайте только одно или два изображения, это полностью зависит от вашего подхода.

вот вам хорошая ссылка:

https://www.raywenderlich.com/2305-core-image-tutorial-getting-started

Надеюсь, это поможет

Другие вопросы по теме