UIImage绘图颜色异常求助:指定绿色却显示洋红色
嘿,这个问题我之前踩过坑!你遇到的绿色变洋红色的情况,大概率是颜色值处理或者颜色空间的问题,咱们一步步来排查修复:
1. 最常见的问题:颜色值范围传错了
UIColor的init(red:green:blue:alpha:)(OC里是colorWithRed:green:blue:alpha:)要求传入的是**0.01.0的浮点数**,而不是0255的整数。如果直接把76、255、0这类整数传进去,系统会自动把超过1.0的值截断为1.0,轻则颜色偏差,重则完全变成意料之外的颜色(如果不小心参数顺序搞反,就很容易出现洋红色)。
修复代码:
把每个RGB值除以255.0转换成0-1的范围:
// Swift 示例 let lineColor = UIColor(red: 76/255.0, green: 255/255.0, blue: 0/255.0, alpha: 1.0)
// Objective-C 示例 UIColor *lineColor = [UIColor colorWithRed:76/255.0 green:255/255.0 blue:0/255.0 alpha:1.0];
2. 颜色空间不匹配导致通道反转
有些图像(比如相机捕获的部分图像)的像素格式是BGRA,或者上下文默认使用了CMYK颜色空间,这时候你传入的RGB颜色会被错误解析,导致颜色通道颠倒,原本的绿色就可能变成洋红色。
修复方案:
强制绘制上下文使用sRGB颜色空间:
// Swift 完整绘制示例 func drawLineOnImage(_ image: UIImage) -> UIImage { UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale) guard let context = UIGraphicsGetCurrentContext() else { return image } // 设置上下文为sRGB颜色空间 let rgbColorSpace = CGColorSpaceCreateDeviceRGB() context.setStrokeColorSpace(rgbColorSpace) // 绘制原图像 image.draw(at: .zero) // 设置线条颜色和属性 let lineColor = UIColor(red: 76/255.0, green: 255/255.0, blue: 0/255.0, alpha: 1.0) lineColor.setStroke() context.setLineWidth(2.0) // 绘制线条(示例:从左上角到右下角) context.beginPath() context.move(to: CGPoint(x: 0, y: 0)) context.addLine(to: CGPoint(x: image.size.width, y: image.size.height)) context.strokePath() let newImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return newImage }
3. 图像渲染模式被设为模板模式
如果你的UIImage设置了renderingMode = .alwaysTemplate,那么所有绘制的颜色都会被图像的tintColor覆盖。如果tintColor刚好是洋红色,那不管你设置什么线条颜色,最终都会显示成洋红色。
修复方案:
确保图像使用原始渲染模式:
// Swift 示例 let originalImage = UIImage(named: "yourImageName")?.withRenderingMode(.alwaysOriginal)
4. 混合模式设置错误
如果上下文的混合模式被改成了.multiply、.screen等非默认模式,线条颜色可能会和图像原有颜色混合,最终呈现出洋红色。
修复方案:
将混合模式重置为正常:
// Swift 示例 context.setBlendMode(.normal)
先从第一个原因排查起,这个概率最高,绝大多数情况都是因为忘记把255范围的RGB值转换成0-1的浮点数导致的!
内容的提问来源于stack exchange,提问作者user9469498

