如何在UIImage中打透明孔?获取当前上下文遇nil问题求助
在UIImage中创建透明孔的正确实现
嘿,我来帮你搞定这个问题!你遇到的UIGraphicsGetCurrentContext()返回nil的问题,本质是你还没创建并开启图形上下文就去获取它了——这个方法只能拿到当前已经存在的上下文,所以得先手动搭建好“绘图画布”才行。
下面是完整的可运行代码,我会拆解关键步骤帮你理解:
// 先确保你有原始图片(这里用命名图片举例,你也可以用其他方式获取) guard let originalImage = UIImage(named: "your_image_name") else { print("找不到原始图片") return } // 定义你要挖的透明孔区域 let holeRect = CGRect(x: 0, y: 0, width: 50, height: 50) // 1. 开启支持透明的图形上下文 // 参数说明: // - size: 用原始图片的尺寸,保证处理后的图片大小一致 // - opaque: 设为false,让上下文支持透明通道 // - scale: 用原始图片的scale,保证图片清晰度不会下降 UIGraphicsBeginImageContextWithOptions(originalImage.size, false, originalImage.scale) // 2. 先把原始图片绘制到上下文中(相当于在画布上打底) originalImage.draw(in: CGRect(origin: .zero, size: originalImage.size)) // 3. 现在获取上下文就不会是nil了 if let context = UIGraphicsGetCurrentContext() { // 4. 清除指定区域的像素,形成透明孔 context.clear(holeRect) } // 5. 从上下文中取出处理好的图片 let imageWithTransparentHole = UIGraphicsGetImageFromCurrentImageContext() // 6. 一定要结束上下文,释放资源 UIGraphicsEndImageContext() // 最后赋值给你的UIImageView myImage.image = imageWithTransparentHole
关键注意点:
- 必须先调用
UIGraphicsBeginImageContextWithOptions开启上下文,这一步是创建“绘图画布”的核心,没有它的话UIGraphicsGetCurrentContext()肯定返回nil。 opaque参数一定要设为false,否则清除区域会显示黑色(而不是透明),因为不透明上下文没有alpha通道。- 别忘了调用
UIGraphicsEndImageContext(),避免内存泄漏。
内容的提问来源于stack exchange,提问作者H.Epstein
相关产品推荐
相关产品推荐

