Swift中如何通过UIBezierPath裁剪图片?路径裁剪失效求助
问题分析与修复方案
你的代码存在几个关键问题导致路径区域裁剪失效:
- 使用默认绘图上下文不支持透明效果,清除区域后无法呈现预期的透明裁剪结果
clear方法的高度参数写错(误用width代替height)- 裁剪逻辑错误:
clip是限制后续绘制的范围,当前写法会清除裁剪区域内所有内容,和你“移除路径覆盖区域”的需求不符
修复后的代码
guard let originalImage = treaCameraImage else { return } // 创建支持透明和Retina适配的绘图上下文 UIGraphicsBeginImageContextWithOptions(originalImage.size, false, 0) defer { UIGraphicsEndImageContext() } // 确保上下文被正确销毁 originalImage.draw(at: .zero) if let context = UIGraphicsGetCurrentContext() { // 设置混合模式为清除,填充路径时会直接清除对应区域像素 context.setBlendMode(.clear) // 填充路径,实现移除路径覆盖区域的效果 path.fill() } let newImage = UIGraphicsGetImageFromCurrentImageContext() imageCut.image = newImage
关键改动说明
- 改用
UIGraphicsBeginImageContextWithOptions创建上下文:第二个参数传false开启透明通道,第三个参数传0自动适配屏幕缩放比例 - 使用
.clear混合模式:填充路径时直接清除路径覆盖的像素,精准实现“移除路径区域”的需求 - 移除冗余的
clip和clear操作,简化逻辑同时解决核心问题
内容的提问来源于stack exchange,提问作者mariovzc
相关产品推荐
相关产品推荐

