Преобразование изображения в UIImage искажает цвет SWIFT

#swift #uiimage #ciimage

#swift #uiimage #преобразование изображения

Вопрос:

Я столкнулся с проблемой, из-за которой я преобразовал изображения из CIImage => UIImage, и цвета где-то в процессе преобразования искажаются.

Тестовый пример, который я настроил, представляет собой изображение чистого синего цвета, которое я открываю с помощью CIImage и URL-адреса пути. Я конвертирую его в UIImage, используя, как мне казалось, довольно стандартный способ преобразования CIImage в 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, 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)
}
  

Ответ №1:

Итак, моя функция преобразования неправильно инициализировала 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
  }