Как обрезать изображение с заданным углом с помощью Swift - PullRequest
0 голосов
/ 26 октября 2018

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

Crop an image with a given angle

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

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

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

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

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

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

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

0 голосов
/ 26 октября 2018

Проектирование раскадровки и создание выходов и свойств в классе 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)

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

Снимать изображение с камеры - создайте 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,

view.layer.addSublayer(fillLayer)

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

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

для масштабирования как scroll 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!)
...