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