CIImage到UIImage会扭曲颜色SWIFT

问题描述

我遇到了一个问题,该问题是我已经从CIImage => UIImage转换了图像,并且颜色在转换过程中出现了变形。

我设置的测试用例是我用CIImage和路径的URL打开的纯蓝色图像。我使用我认为是将CIImage转换为UIImage的非常标准的方式将其转换为UIImage,即CIContext:createCGImage,然后检查像素之一。

预期:

pixelColor :: rgba : 0.0 : 0.0 : 1.0 : 1.0 

实际:

pixelColor :: rgba : 0.0 : 0.1803921568627451 : 1.0 : 1.0 

无论如何,如果有人可以指出为什么会这样,我将不胜感激。谢谢。

guard let path = Bundle.main.path(forResource: "Blue",ofType: "png") else { // RGBA 0,255,0
  debugPrint("File :: Blue not found")
  return
}
let url = URL(fileURLWithPath: path)

if let ciImage = CIImage(contentsOf: url) {
  let converted = convert(ciImage: ciImage)
  let _ = converted.getPixelColor(pos: pixelPoint)
}

-

func convert(ciImage:CIImage) -> UIImage
{
    let context:CIContext = CIContext.init(options: nil)
    let cgImage:CGImage = context.createCGImage(ciImage,from: ciImage.extent)!
    let image:UIImage = UIImage.init(cgImage: cgImage)
    return image
}

-

extension UIImage {
    func getPixelColor(pos: CGPoint) -> UIColor {

    let pixelData = self.cgImage!.dataProvider!.data
    let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

    let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

    let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
    let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
    let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
    let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)

    print("pixelColor :: rgba : \(r) : \(g) : \(b) : \(a)")

    return UIColor(red: r,green: g,blue: b,alpha: a)
}

解决方法

因此,我的convert函数未正确初始化CIContext。这是更正的方法:

  func convert(ciImage:CIImage) -> UIImage?
  {
    let context = CIContext(options: [CIContextOption.workingColorSpace: kCFNull!])
    if let cgImage:CGImage = context.createCGImage(ciImage,from: ciImage.extent,format: .RGBA8,colorSpace: CGColorSpace.init(name: CGColorSpace.sRGB)!) {
      let image:UIImage = UIImage.init(cgImage: cgImage)
      return image
    }
    return nil
  }