gpt4 book ai didi

swift - CIImage 像素的 RGB 值

转载 作者:行者123 更新时间:2023-12-03 20:58:52 26 4
gpt4 key购买 nike

我想访问 CVPixelBuffer 特定区域的平均颜色值我从 ARFrame 得到的实时。我设法裁剪图像,使用过滤器计算平均颜色,然后转换为 CGImage我从像素中获取值,但不幸的是,它影响了我的应用程序的性能(FPS 低于 30fps)。我认为这样做的原因是使用 CGContext。有没有办法在不转换的情况下访问颜色 CIImageCGImage ?
这是我目前正在使用的代码:

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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com