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)
一种解决方案是在蒙版后裁剪图像,但理想情况下,我希望一次性完成该操作尽可能简单和有效。
任何解决方案/提示将不胜感激。
感谢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)
| 归档时间: |
|
| 查看次数: |
1320 次 |
| 最近记录: |