如何快速裁剪给定角度的图像

时间:2018-10-26 04:35:29

标签: ios swift image uiimage crop

有人知道如何快速裁剪给定角度的图像吗? 我将演示图像放在下面。 我在Google上搜索了一会儿,发现几乎所有解决方案都是关于不旋转或90度旋转的图像。 我想旋转图像,然后像iPhone中的Photo App一样对其进行裁剪。 感谢您的提示!

Crop an image with a given angle

2 个答案:

答案 0 :(得分:0)

设计情节提要,并在ViewController类中创建出口和属性。

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

属性crop有一个自定义的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.
}

裁剪—

将subLayer添加到拾取的图像中-该层提供了一个固定裁剪框的区域。

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!)

答案 1 :(得分:0)

一种选择是使用CGContext和CGAffineTransform根据您的角度旋转。

制作两个矩形,一个用于旋转图像,一个用于裁剪图像,然后使用裁剪(对CGRect进行缩放)-> CGImage?

最终根据您的逻辑只制作一幅或两幅图像,这完全取决于您的方法。

这里为您提供了很好的参考:

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

希望有帮助