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

为透明图片应用CIGaussianBlur后丢失透明度变黑的问题求助

解决透明图片应用CIGaussianBlur后背景变黑的问题

问题根源有两点:

  • 默认创建的CIContext未配置透明度相关参数,渲染时透明区域被填充为黑色
  • 模糊处理后图像范围会向外扩展,直接套用原图像范围裁剪会导致边缘处理异常

修改后的代码如下:

func blurImage(image: UIImage) -> UIImage? {
    // 配置支持透明的CIContext,启用预乘alpha并使用设备默认颜色空间
    let contextOptions: [CIContextOption: Any] = [
        .workingColorSpace: NSNull(),
        .outputPremultiplied: true
    ]
    let context = CIContext(options: contextOptions)
    
    guard let inputImage = CIImage(image: image) else { return nil }
    let originalOrientation = image.imageOrientation
    let originalScale = image.scale
    let originalExtent = inputImage.extent

    guard let filter = CIFilter(name: "CIGaussianBlur") else { return nil }
    filter.setValue(inputImage, forKey: kCIInputImageKey)
    filter.setValue(5.0, forKey: kCIInputRadiusKey)
    
    guard let outputImage = filter.outputImage else { return nil }
    // 将模糊后的图像裁剪回原图像尺寸,避免输出图片变大
    let croppedOutput = outputImage.cropped(to: originalExtent)
    
    guard let cgImage = context.createCGImage(croppedOutput, from: originalExtent) else { return nil }
    return UIImage(cgImage: cgImage, scale: originalScale, orientation: originalOrientation)
}

关键说明:

  • CIContext的workingColorSpace设为NSNull()表示使用设备默认RGB空间,outputPremultiplied参数确保预乘alpha通道被正确处理,保留图像透明度
  • 用cropped(to:)将模糊后的图像裁剪回原范围,保证输出尺寸与原图一致
  • 增加了可选值的安全解包,避免运行时崩溃

内容的提问来源于stack exchange,提问作者SwiftyLifestyle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:25:22