CIImage 到 UIImage 扭曲颜色 SWIFT
CIImage to UIImage Distorts Color 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, 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)
}
所以我的转换函数没有正确初始化 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
}
我 运行 遇到一个问题,我从 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, 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)
}
所以我的转换函数没有正确初始化 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
}