我想访问 CVPixelBuffer
特定区域的平均颜色值我从 ARFrame
得到的实时。我设法裁剪图像,使用过滤器计算平均颜色,然后转换为 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
)
}
最佳答案
我认为您在这里无能为力——像这样的还原操作很昂贵。
您可以尝试以下几点:
CIContext
通过设置 .workingColorSpace
不执行任何颜色管理和 .outputColorSpace
NSNull()
的选项. CGImage
.上下文具有方法 render(_ image: CIImage, toBitmap data: UnsafeMutableRawPointer, rowBytes: Int, bounds: CGRect, format: CIFormat, colorSpace: CGColorSpace?)
你可以用它。也通nil
作为这里的色彩空间。您应该能够将“指针”传递给 simd_uchar4
var as data
这里。 rowBytes
将是 4,格式将是 .BGRA8
在这种情况下,我认为。 关于swift - CIImage 像素的 RGB 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59396448/