如何使用Swift选择图像的一部分,裁剪并保存?

时间:2015-07-06 19:50:25

标签: ios image camera uiimagepickercontroller crop

我正在尝试使用Swift创建一个iOS应用程序来捕获图像,并让用户保存图像的选定部分。在许多基于凸轮的应用程序中,我注意到提供了一个矩形框架,让用户选择所需的部分。这涉及滑动矩形的边缘或移动角落以适应所需的区域。

请您指导一下如何实现可移动的矩形以及如何仅保存图像的那一部分?

5 个答案:

答案 0 :(得分:28)

使用Swift 3

可以使用 CoreGraphics 中的 CGImages 来完成图像裁剪。

获取像这样的UIImage的CGImage版本:

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

CGImage对象有一个方法 裁剪(到: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属性定义将被裁剪的图像内的“裁剪矩形”。

答案 1 :(得分:10)

找到另一个解决方案。这次是在斯威夫特。该解决方案看起来很优雅,相对于其他此类解决方案的代码用较少的行编写。

这是...... https://github.com/DuncanMC/CropImg 感谢Duncan Champney在github上发表他的作品。

答案 2 :(得分:7)

https://github.com/myang-git/iOS-Image-Crop-View做了类似于你所寻找的事情......

希望这有帮助。

答案 3 :(得分:0)

如果在裁剪图像后出现旋转90等问题,请尝试此操作 存储原始图像比例和方向属性以供以后使用

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

从UIImage获取CGImage:

let cgImage = image.cgImage

传递要裁剪的cropArea(CGRect)区域(如果您正在使用imageView.image,您已找到比例并执行数学查找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

答案 4 :(得分:-1)

我一直在寻找iOS 13,Swift 5的答案,下面是救星库:CropViewController

它几乎具有您梦dream以求的所有功能:以任何纵横比裁剪,图像旋转,重置为原始图像,半透明背景。而且它易于安装(Cocoapod,Carthage)并且非常易于使用。记住要查看回购中包含的他们的演示样本应用程序。