为透明图片应用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
相关产品推荐
相关产品推荐

