SwiftUI新手求助:如何反转ImageRenderer生成图片的颜色?
最简单的Canvas生成图片颜色反转实现(黑底白字)
针对你的需求,用Core Image的CIColorInvert滤镜是最直接的方案,代码简单且不容易出错,适合Swift新手。之前你得到空白结果大概率是因为图片转换流程没走对,下面是完整的实现步骤:
1. 导入CoreImage框架
首先在你的文件顶部添加导入:
import CoreImage
2. 给UIImage写个颜色反转的扩展
把反转逻辑封装成扩展,方便复用和维护:
extension UIImage { func inverted() -> UIImage? { // 将UIImage转为CIImage guard let ciImage = CIImage(image: self) else { return nil } // 初始化反转滤镜 let invertFilter = CIFilter(name: "CIColorInvert")! invertFilter.setValue(ciImage, forKey: kCIInputImageKey) // 获取滤镜输出并转为CGImage guard let outputCI = invertFilter.outputImage else { return nil } let context = CIContext(options: [.useSoftwareRenderer: false]) guard let outputCG = context.createCGImage(outputCI, from: outputCI.extent) else { return nil } // 转回UIImage返回 return UIImage(cgImage: outputCG) } }
3. 修改你的按钮代码
在生成Canvas图片后调用反转方法,再保存和显示:
Button(action: { guard let originalImage = ImageRenderer(content: canvas).uiImage else { // 渲染图片失败,可在这里加提示 return } // 执行颜色反转 guard let invertedImage = originalImage.inverted() else { // 反转失败,可加提示 return } // 保存到相册+显示结果 UIImageWriteToSavedPhotosAlbum(invertedImage, nil, nil, nil) resultImage = Image(uiImage: invertedImage) }){ Text("Analyze") }
特殊情况处理:如果Canvas是透明背景
如果你的Canvas生成的图片是透明背景(而非白底),反转后会得到透明背景的白字,想要黑底的话,再加个给图片加黑底的扩展:
extension UIImage { func addBlackBackground() -> UIImage? { UIGraphicsBeginImageContextWithOptions(size, true, scale) UIColor.black.setFill() // 填充整个画布为黑色 UIRectFill(CGRect(origin: .zero, size: size)) // 在黑底上绘制反转后的白字图片 draw(at: .zero) let finalImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return finalImage } }
然后修改调用顺序:
guard let originalImage = ImageRenderer(content: canvas).uiImage, let invertedImage = originalImage.inverted(), let finalImage = invertedImage.addBlackBackground() else { return } // 后续用finalImage保存和显示
这个方案逻辑清晰,步骤少,完全基于系统API,不会有第三方依赖,很适合新手上手。
内容的提问来源于stack exchange,提问作者Ashbury
相关产品推荐
相关产品推荐

