【问题标题】:Fastest way to render CIImage to JPEG?将 CIImage 渲染为 JPEG 的最快方法?
【发布时间】:2021-12-29 09:29:47
【问题描述】:

我有一个CIFilter 管道。

它当前输出UIImage 使用:

private func renderImage(ciImage: CIImage) -> UIImage?
{
    let cgImage = Filter.context.createCGImage(ciImage, from: ciImage.extent)

    return cgImage.map(UIImage.init)
}

UIImage 稍后会转换为 JPEG 并存储。

现在需要批量过滤图像并跳过UIImage 格式。这需要尽快完成。

Here 有几种方法可以做到这一点。

哪种方式最快?

【问题讨论】:

  • 请注意:从 CIImage 到实际图像的转换永远不会很快,因为所有过滤器/转换都应用于转换(尽管它们已被优化)。如果速度真的很重要,请考虑使用 Accelerate 框架(即:developer.apple.com/documentation/accelerate/…
  • @KirilS。作为 Accelerate 的新手,我想这意味着我必须自己实现 iOS 附带的 CIFilters 并重写 myMetal 过滤器?
  • 哦,是的,使用金属过滤器是不值得的。我更多地考虑内置过滤器。从 CIImage 到 JPEG 的转换可能仍然很慢,尤其是对于 RAW 图像。但你会看到。祝你好运!
  • @KirilS。为什么不值得使用 Accelerate with Metal 过滤器? Metal 中不都是内置的 CIFilter 吗?
  • 我的意思是如果图像的目标是位图,并且你正在使用一些内置的过滤器,你在浪费(可能很长)时间关于从 CIImage 转换为 CGImage / JPEG。相反,您可以直接在位图上使用 Accelerate(Apple 提供了一些很好的示例,说明如何使用 Accelerate 执行相同的内置过滤器)。但是,使用您的自定义过滤器,将它们转换为 Accelerate,调试这些过滤器,并测试是否可以通过转换为位图的速度来补偿失去的在 GPU 上运行的能力 - 这是不现实的。

标签: ios swift performance core-image ciimage


【解决方案1】:

您也可以使用CIContext 做到这一点:

let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)!
// if you need the JPEG data
let data = Filter.context.jpegRepresentation(of: ciImage, colorSpace: colorSpace)
// or if you want to write to file directly
try Filter.context.writeJPEGRepresentation(of: ciImage, to: url, colorSpace: colorSpace)

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2014-03-19
    • 2013-11-07
    • 2014-05-21
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多