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

19

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

请您指导我如何实现可移动的矩形,并如何仅保存该图像片段?

5个回答

39

使用Swift 3

可以使用来自CoreGraphics的CGImages进行图像裁剪。

获取UIImage的CGImage版本,可以使用以下代码:

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

CGImage对象有一个名为cropping(to: 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 属性定义了图像内部将被裁剪的“裁剪矩形”。


为什么这个答案没有被标记为正确的答案?这段代码能够工作吗? - Yestay Muratov
应该是正确的答案,主要是由于本地代码和没有第三方库。 - jlmurph
1
我们需要写什么来代替参数CGRect?我有点困惑。 - user8381604
1
请求提供使用示例,包括原始图像和裁剪后的图像...我得到了一些结果,但是它们很奇怪(旋转等)。 - Dan
有没有类似的东西,可以裁剪视频的特定矩形并在单独的层中播放该矩形? - Nassif

10

找到了另一个解决方案。这次是用Swift编写的。该解决方案看起来很优雅,相对于其他类似的解决方案,代码行数更少。

在这里... https://github.com/DuncanMC/CropImg 感谢Duncan Champney将他的工作放在GitHub上供大家使用。


1
这个还没有更新到Xcode 8 / Swift 3,所以它不能工作。 - Nick M

7

1
你提供的解决方案完全符合我的要求,但它是用Objective-C编写的,我会尝试使用Swift编写代码或准备一个桥接头文件。感谢Subbu,你节省了我宝贵的时间。我真诚地感谢在github上发布这个解决方案的Ming Yang。 - Sriram
3
这个解决方案有没有 Swift 版本? - Shashant Dahikar
1
iOS-Image-Crop-View 上是否有 Swift 版本可用? - PvDev

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

-1

我正在寻找适用于iOS 13、Swift 5的解决方案,然后发现了救星库:CropViewController

它几乎拥有你能想到的所有功能:任意比例裁剪、图像旋转、重置为原始图像、半透明背景。而且它易于安装(Cocoapod、Carthage)和非常易于使用。记得查看他们在repo中包含的演示示例应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接