将UIImage剪切到UIBezierPath(不屏蔽)

Ale*_*der 4 uiimage ios uibezierpath uigraphicscontext swift

我正在尝试UIImage根据给定剪辑a UIBezierPath,但是结果图像保留了原始形状和大小。我希望形状和大小类似于路径,即新图像的可见内容。

看下面的例子:

输入图像,输入路径,实际结果和所需结果

以下是我用来屏蔽给定路径的图像的代码:

func imageByApplyingClippingBezierPath(_ path: UIBezierPath) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(CGSize(
        width: size.width,
        height: size.height
    ), false, 0.0)
    let context = UIGraphicsGetCurrentContext()!
    context.saveGState()

    path.addClip()
    draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

    let newImage = UIGraphicsGetImageFromCurrentImageContext()!

    context.restoreGState()
    UIGraphicsEndImageContext()

    return newImage
}
Run Code Online (Sandbox Code Playgroud)

一种解决方案是在蒙版后裁剪图像,但理想情况下,我希望一次性完成该操作尽可能简单和有效。

任何解决方案/提示将不胜感激。

Ale*_*der 5

感谢Rob,我能够使用的cropping(to:)方法来实现解决方案CGImage

这是一个两步过程,其中我首先使用给定的路径遮罩图像,然后使用路径的边界裁剪结果。

以下是我实现剪切 UIBezierPath UIImage扩展的最终工作源代码:

extension UIImage {

    func imageByApplyingClippingBezierPath(_ path: UIBezierPath) -> UIImage {
        // Mask image using path
        let maskedImage = imageByApplyingMaskingBezierPath(path)

        // Crop image to frame of path
        let croppedImage = UIImage(cgImage: maskedImage.cgImage!.cropping(to: path.bounds)!)
        return croppedImage
    }

    func imageByApplyingMaskingBezierPath(_ path: UIBezierPath) -> UIImage {
        // Define graphic context (canvas) to paint on
        UIGraphicsBeginImageContext(size)
        let context = UIGraphicsGetCurrentContext()!
        context.saveGState()

        // Set the clipping mask
        path.addClip()
        draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        let maskedImage = UIGraphicsGetImageFromCurrentImageContext()!

        // Restore previous drawing context
        context.restoreGState()
        UIGraphicsEndImageContext()

        return maskedImage
    }

}
Run Code Online (Sandbox Code Playgroud)