0

我在 Core Image 中编写了一个自定义内核:

outputImage = kernel.apply(extent: extent,
                           roiCallback: roiCallback,
                           arguments: [inputImage])!

static let kernel = CIKernel(source:"""
kernel vec4 process(sampler src) {
  vec4 pixel = sample(src, samplerTransform(destCoord()));
  return pixel;
}   
""")!

(这是一个简单的无操作内核用于说明,而不是实际内核。)

输入是 BGRA,但我希望输出 CIImage 是 BGR(或 RGB 或任何其他顺序)。这可能吗?

我想这样做的原因是输入图像中的所有 alpha 值都是 1,所以我不想浪费内存(和处理时间)在输出图像中存储数百万个 1,如果我可以跳过它的话。我的代码对性能敏感,运行速度不够快,所以我正在寻找优化它的方法。

以防万一,我的目标是 iOS 11 及更高版本。


我尝试将代码更改为:

kernel vec3 process(sampler src) {
  vec3 pixel = sample(src, samplerTransform(destCoord())).xyz;
  return pixel;
}

但我得到一个错误:

invalid kernel return type; valid types are 'vec2' and 'vec4' 

正如 II 在回答中指出的那样, vec3 不是有效的返回类型,所以这个想法行不通。那有什么作用呢?

4

1 回答 1

0

根据 Apple 文档,返回类型必须是 vec 4,但不一定是 BGRA 像素甚至是像素:

为目标图像的每个像素调用一次内核例程。该例程必须返回 vec4 数据类型。虽然这个四元素向量通常包含像素数据,但该向量不需要表示像素

来自:编写内核

于 2017-10-19T18:38:45.917 回答