我想访问从实时
ARFrame
获取的CVPixelBuffer
特定区域的平均颜色值。我设法裁剪图像,使用滤镜计算平均颜色,并在转换为CGImage
后从像素中获取值,但不幸的是,这影响了我的应用程序性能(FPS降至30fps以下)。我认为造成这种情况的原因是使用CGContext
。是否有一种方法可以在不将CIImage
转换为CGImage
的情况下访问颜色?
这是我目前正在使用的代码:func fun() {
let croppVector = CIVector(cgRect: inputImageRect)
guard let filter = CIFilter(
name: "CIAreaAverage",
parameters: [kCIInputImageKey: image, kCIInputExtentKey: croppVector]
),
let outputImage = filter.outputImage,
let cgImage = context.createCGImage(
outputImage,
from: CGRect(x: 0, y: 0, width: 1, height: 1)
),
let dataProvider = cgImage.dataProvider,
let data = CFDataGetBytePtr(dataProvider.data) else { return nil }
let color = UIColor(
red: CGFloat(data[0]) / 255,
green: CGFloat(data[1]) / 255,
blue: CGFloat(data[2]) / 255,
alpha: CGFloat(data[3]) / 255
)
}
CVPixelBufferGetBaseAddress
访问原始数据。关于性能:您是否尝试在方案设置中禁用“GPU帧捕获”和“Metal API验证”?这些会严重干扰任何性能基准测试。 - Frank Rupprecht