我已经编写了一个rgbToHSV cikernel来转换图像中的像素;但是,它不能正常工作。我已经把它缩小到RGB值在一路上被扭曲的事实。
为了简化我的代码,我把它改成了一个简单的直通过滤器。
我已经通过了1280 x 720的图像,它们都是一种颜色,然后在通过cikernel之前和之后在位置(100,100(v处采样像素颜色。
结果如下:
红色之前:pixel颜色::rgba:1.0:0.0:1.0之后:pixel颜色:rgba:1.0:0.07450980392156863:0.0:1.0
绿色之前:像素颜色::rgba:0.0:1.0:0.0:1.0之后:pixel颜色:rgba:0.0:0.984313725490196:0.0:1.0
蓝色之前:像素颜色::rgba:0.0:0.0:1.0:1.0之后:pixel颜色:rgba:0.0:0.180392168627451:1.0:1.0
正如你所看到的,红色和绿色被轻微扭曲,但蓝色被严重扭曲。
我已经保存了输出文件并检查了颜色,过滤器肯定在改变颜色。
任何关于为什么一个简单的通行证会改变颜色的见解都会受到极大的赞赏。
简化直通滤波器:
kernel vec4 rgbToHsv( __sample rgb) {
return rgb;
}
以下是使用cikernel的CIFilter:
class RgbToHsvFilter: CIFilter {
@objc dynamic var inputImage: CIImage?
private lazy var kernel: CIColorKernel? = {
guard let path = Bundle.main.path(forResource: "RgbToHsv", ofType: "cikernel"),
let code = try? String(contentsOfFile: path) else { fatalError("Failed to load RgbToHsv.cikernel from bundle") }
let kernel = CIColorKernel(source: code)
return kernel
}()
override public var outputImage: CIImage! {
get {
if let inputImage = self.inputImage {
let args = [inputImage as AnyObject]
return self.kernel?.apply(extent: inputImage.extent, arguments: args)
} else {
return nil
}
}
}
}
调用过滤器
let rgbToHsvFilter = RgbToHsvFilter()
let currentCI = CIImage(cgImage: colorImage!.cgImage!)
rgbToHsvFilter.setValue(currentCI, forKey: kCIInputImageKey)
if let hsvImage = rgbToHsvFilter.outputImage {
if let image = cgImage(from: hsvImage) {
let newImage = UIImage(cgImage: image as! CGImage)
let _ = newImage.getPixelColor(pos: pixelPoint)
//UIImageWriteToSavedPhotosAlbum(newImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
}
}
}
其中CGPoint被设置为(100。我认为这个问题可能是由于打印声明中对颜色的错误陈述而发生的,但我检查了实际输出图像,过滤器正在更改图像颜色:
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)
}
和cgImage(编辑(:
func cgImage(from ciImage: CIImage) -> CGImage? {
let context = CIContext(options: nil)
return context.createCGImage(ciImage, from: ciImage.extent)
}
因此CIContext在方法cgImage中没有正确初始化。
以下是更正后的方法:
func cgImage(from ciImage: CIImage) -> CGImage? {
let context = CIContext(options: [CIContextOption.workingColorSpace: kCFNull!])
return context.createCGImage(ciImage, from: ciImage.extent, format: .RGBA8, colorSpace: CGColorSpace.init(name: CGColorSpace.sRGB)!)
}