CoreGraphics中draw(_:)设置颜色与屏幕显示不一致问题排查
颜色条显示颜色与计算值不符的问题解决
我需要绘制一组自定义计算的颜色条,检查mapValueToRGB函数返回的颜色值,计算结果看起来正常,但屏幕上显示的颜色和预期不符。比如第244个像素应该接近纯红,实际显示却是(233, 51, 35)。
原draw(_:)函数代码
guard let context = NSGraphicsContext.current?.cgContext else { return } context.setLineWidth(1) for y in 0..<Int(frame.height) { let p = CGFloat(y)/frame.height let color = mapValueToRGB(value: p, minMax: minMax, colorsMap: colors) print(y, color) context.setStrokeColor(color) context.move(to: CGPoint(x: xStart, y: y)) context.addLine(to: CGPoint(x: xEnd, y: y)) context.drawPath(using: .fillStroke) }
控制台输出
y: 242 <CGColor 0x600001b60ba0> (...) ( 0.99384 0 0 1 ) y: 243 <CGColor 0x600001b60c00> (...) ( 0.997947 0 0 1 ) y: 244 <CGColor 0x600001b60c60> (...) ( 1 0.00205339 0.00205339 1 ) y: 245 <CGColor 0x600001b60cc0> (...) ( 1 0.00616016 0.00616016 1 )
计算得到的颜色分量是正常的,但屏幕显示结果不符合预期。
问题原因
mapValueToRGB返回的CGColor所使用的颜色空间,与当前绘图上下文的颜色空间不匹配,导致渲染时颜色被错误转换,最终显示出偏差。
修正后的代码
guard let context = NSGraphicsContext.current?.cgContext else { return } context.setLineWidth(1) for y in 0..<Int(frame.height) { let p = CGFloat(y)/frame.height let components: simd_float4 = mapValueToRGB(value: p, minMax: minMax, colorsMap: colors) let color = CGColor(colorSpace: colorSpace, components: [CGFloat(components.x), CGFloat(components.y), CGFloat(components.z), CGFloat(components.w)]) context.setStrokeColor(color!) context.move(to: CGPoint(x: xStart, y: y)) context.addLine(to: CGPoint(x: xEnd, y: y)) context.drawPath(using: .fillStroke) }
通过手动指定与绘图上下文一致的colorSpace来创建CGColor,确保颜色分量能被正确解析和渲染,解决了显示不符的问题。
内容的提问来源于stack exchange,提问作者user25020188
相关产品推荐
相关产品推荐

