我想获得 CIAreaHistogram
的 UIImage
。
下面我复制我运行的代码。 print()
语句当前打印 255 行,其中 0.0 0.0 0.0
后跟最后一行是 0.0 0.0 0.058823529
。
我的 UIImage
输入也显示在屏幕上,所以我确定有图像。
我也在 CIFilter.io 应用程序中尝试过这个过滤器。奇怪的是,给定一个彩色输入图像,输出图像是一条单一的灰色线。我当然希望有一条线,但不是纯灰色。
我可能做错了什么?
let inputImage = CIImage(cgImage: outputImage!.cgImage!)
let histogramFilter = CIFilter(name: "CIAreaHistogram", parameters: [kCIInputImageKey : inputImage,
"inputExtent" : inputImage.extent,
"inputScale" : NSNumber(value: 1.0),
"inputCount" : NSNumber(value: 256)])!
func processHistogram(ciImage: CIImage)
{
let image = renderImage(ciImage: ciImage)
for x in 0 ... 255
{
getPixelColor(fromCGImage: (image?.cgImage!)!, pos: CGPoint(x: x, y: 0))
}
}
func getPixelColor(fromCGImage cgImage: CGImage, pos: CGPoint) -> UIColor
{
let pixelData = cgImage.dataProvider!.data
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelInfo: Int = ((Int(cgImage.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("\(r) \(g) \(b)")
return UIColor(red: r, green: g, blue: b, alpha: a)
}
func renderImage(ciImage: CIImage) -> UIImage?
{
var outputImage: UIImage?
let size = ciImage.extent.size
UIGraphicsBeginImageContext(size)
if let context = UIGraphicsGetCurrentContext()
{
context.interpolationQuality = .high
context.setShouldAntialias(true)
let inputImage = UIImage(ciImage: ciImage)
inputImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
outputImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
return outputImage
}