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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:59:56