You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:13:48