ios - 如何将 RGBA 转换为 UIColor 并返回

标签 ios swift core-graphics pixel core-image

如何将我的结构 RGBA 转换为 UIColor 并返回

struct RGBA {
    
    var r: UInt8
    var g: UInt8
    var b: UInt8
    var a: UInt8

    var toUIColor: UIColor {
        let red = CGFloat(r) / CGFloat(255)
        let green = CGFloat(g) / CGFloat(255)
        let blue = CGFloat(b) / CGFloat(255)
        let alpha = CGFloat(a) / CGFloat(255)
        
        return UIColor(displayP3Red: CGFloat(red),
                       green: CGFloat(green),
                       blue: CGFloat(blue),
                       alpha: CGFloat(alpha))
    }
}
extension UIColor {
    
    var toRGBA: RGBA {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        return RGBA(r: UInt8(max(0, min(255, red * 255))),
                    g: UInt8(max(0, min(255, green * 255))),
                    b: UInt8(max(0, min(255, blue * 255))),
                    a: UInt8(max(0, min(255, alpha * 255))))
    }
}

当我使用他的代码时,我的颜色准确性较差

Draw pipline
select UIColor -> toRGBA ->
0.7490196078431373 0.35294117647058826 0.9490196078431372 1.0

select color on canvas -> toUIColor
draw line -> toRGBA -> 
0.803921568627451 0.3215686274509804 0.9803921568627451 1.0
var canvasSize = PixelSize(width: 16, height: 16) //  (Int, Int)

func createImage(by pixels: [RGBA]) -> UIImage? {
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let data = UnsafeMutableRawPointer(mutating: pixels)

    let bitmapContext = CGContext(data: data,
                                  width: canvasSize.width,
                                  height: canvasSize.height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: 4 * canvasSize.width,
                                  space: colorSpace,
                                  bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)

    guard let image = bitmapContext?.makeImage() else { return nil }
    return UIImage(cgImage: image)
}

怎么了?

最佳答案

欢迎!

问题是您使用了两种不同的颜色空间:

  • RGBA 转换为 UIColor 时,您假设 RGBA 值位于 Display P3 (UIColor(displayP3Red:...) 中。
  • 但是您使用“设备 RGB”颜色空间创建的 CGContext,据我所知,这是一个 sRGB 颜色空间。

如果您使用 UIColorinit(red:, green:, blue:, alpha:) 初始化程序,它应该可以工作。

关于ios - 如何将 RGBA 转换为 UIColor 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62607452/

相关文章:

ios - 从 Swift 中的数组中获取非零的第一个和最后一个值

ios - 需要帮助设置 IF 语句 iOS Swift

ios - 裁剪 UIImage 时的性能问题(CoreGraphics、iOS)

ios - 如何在 iphone 5 和 iphone 6 上更改 ImageView 的大小?

iphone - 如何正确使用流对象

swift - 设置 constraint.isActive = true 时抛出错误

iphone - 如何对 UIImage 进行去饱和处理?

ios - UIBezierPath 绘制问题

ios - UINavigationBar 未显示,尝试了多个修复

ios - 使用哪种方法实时读取音频样本