【问题标题】:How to select a portion of an image, crop, and save it using Swift?如何使用 Swift 选择图像的一部分、裁剪并保存?
【发布时间】:2015-09-24 02:33:46
【问题描述】:

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

能否请您指导我如何实现那个可移动的矩形以及如何只保存那部分图像?

【问题讨论】:

    标签: ios image camera uiimagepickercontroller crop


    【解决方案1】:

    使用 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 属性定义了将被裁剪的图像内的“裁剪矩形”。

    【讨论】:

    • 为什么这个答案没有被标记为正确的?这段代码有效吗?
    • 应该是正确的答案,主要是由于原生代码和没有第三方库
    • 我们要写什么而不是参数 CGRect ?我有点困惑
    • 请求使用原始图像和裁剪图像的示例......我得到了一些东西,但结果很奇怪(旋转等)。
    • 是否有类似的东西,可以裁剪视频的特定矩形并在单独的图层中播放该矩形
    【解决方案2】:

    又找到了一种解决方案。这次是在 Swift 中。该解决方案看起来很优雅,并且相对于其他此类解决方案的代码编写的行数更少。

    这里.. https://github.com/DuncanMC/CropImg 感谢 Duncan Champney 在 github 上提供他的工作。

    【讨论】:

    • 这还没有为 Xcode 8 / Swift 3 更新,所以它不起作用。
    【解决方案3】:

    https://github.com/myang-git/iOS-Image-Crop-View 会做你正在寻找的东西..

    希望这会有所帮助。

    【讨论】:

    • 您提供的解决方案完全符合我的要求,但是它是在 Objective-C 中的,我将尝试在 Swift 中对其进行编码或准备一个桥接头文件。谢谢Subbu,你节省了我宝贵的时间。非常感谢Ming Yang,他在github上发布了这个解决方案。
    • 这个解决方案有快速版本吗?
    • iOS-Image-Crop-View 是否有 swift 版本?
    【解决方案4】:

    如果您在裁剪图像后遇到旋转 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
    

    【讨论】:

      【解决方案5】:

      我一直在寻找 iOS 13、Swift 5 的答案,救星库来了:CropViewController

      它几乎具有您梦寐以求的所有功能:以任何宽高比裁剪、图像旋转、重置为原始图像、半透明背景。它也易于安装(Cocoapod、Carthage)并且非常易于使用。记得查看 repo 中包含的演示示例应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2019-08-16
        相关资源
        最近更新 更多